diff --git a/Documentation/AccessPublicDataset.md b/Documentation/AccessPublicDataset.md new file mode 100644 index 0000000..dc1ede8 --- /dev/null +++ b/Documentation/AccessPublicDataset.md @@ -0,0 +1,85 @@ +## Accessing Public datasets + +### BigQuery™ Public Dataset +A [BigQuery public dataset](https://cloud.google.com/bigquery/public-dataBigQuery) is any dataset that is stored in BigQuery and made available to the general public through the Google Cloud Public Dataset Program. Public datasets are available for you to analyze using either legacy SQL or standard SQL queries. + +You can share any of your datasets with the public by changing the dataset's access controls to allow access by `All Authenticated Users`. For more information about setting dataset access controls, see [Controlling access to datasets](https://cloud.google.com/bigquery/docs/dataset-access-controls). + + +### Kaggle Datasets +[Kaggle](http://www.kaggle.com/) is the world's largest data science community with powerful tools and resources to help you achieve your data science goals. Kaggle supports a variety of dataset publication formats encouraging dataset publishers to share their data on Kaggle in an accessible, non-proprietary format further enabling data scientists to work with public datasets regardless of their tools. Variety of dataset publication formats commonly include CSV, JSON, SQLite, `BigQuery™ Public Dataset` + +#### Search for BigQuery datasets on Kaggle + +Access Kaggle Datasets [here](https://www.kaggle.com/datasets) and apply [`BigQuery filter`](https://www.kaggle.com/datasets?fileType=bigQuery). + + +#### Querying Public Datasets from MATLAB + +` Create a Big query Client` +``` +gbqclient = gcp.bigquery.BigQuery('credentials.json'); + +gbqclient = + + BigQuery with properties: + + ProjectId: 'prxxxxxxxoy' + Handle: [1x1 com.google.cloud.bigquery.BigQueryImpl] + +``` + +`Write a query to a sample public dataset` +``` +smallquery = 'SELECT * FROM `bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017` LIMIT 5;'; +``` + +`Build configuration for Query` + +``` +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(smallquery); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(false); +queryJobConfiguration = queryJobConfigurationBuilder.build; + +queryJobConfiguration = + + QueryJobConfiguration with properties: + + Handle: [1x1 com.google.cloud.bigquery.QueryJobConfiguration] + +``` + +`Query and Return Results` + +``` +tableResult = gbqclient.query(queryJobConfiguration); + +tableResult = + + TableResult with properties: + + Handle: [1x1 com.google.cloud.bigquery.TableResult] + + +% Extracting query results into a MATLAB table +mattable = gbq2table(tableResult1); + +mattable = + + 5x19 table + + date hour lat long signal network operator status description net speed satellites precission provider activity downloadSpeed uploadSpeed postal_code town_name + ____________________ ________ ______ ______ ______ _________ _________ ______ __________________ ______ _____ __________ __________ ____________ _________ _____________ ___________ ___________ _________ + + 21-Dec-2016 00:00:00 12:04:16 42.112 2.774 20 "orange" "JAZZTEL" 0 "STATE_IN_SERVICE" "24.7" 18 3 NaN "IN_VEHICLE" "170157" NaN 0 + 21-Dec-2016 00:00:00 12:03:14 42.109 2.7777 15 "orange" "JAZZTEL" 0 "STATE_IN_SERVICE" "26.3" 18 3 NaN "IN_VEHICLE" "170157" NaN 0 + 21-Dec-2016 00:00:00 12:07:20 42.117 2.7649 13 "orange" "JAZZTEL" 0 "STATE_IN_SERVICE" "4.9" 14 3 NaN "IN_VEHICLE" "170157" NaN 0 + 21-Dec-2016 00:00:00 12:06:19 42.117 2.7659 13 "orange" "JAZZTEL" 0 "STATE_IN_SERVICE" "16.6" 14 3 NaN "IN_VEHICLE" "170157" NaN 0 + 21-Dec-2016 00:00:00 12:05:17 42.115 2.7684 15 "orange" "JAZZTEL" 0 "STATE_IN_SERVICE" "33.7" 18 3 NaN "IN_VEHICLE" "170157" NaN 0 + + + + +``` + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/Authentication.md b/Documentation/Authentication.md new file mode 100644 index 0000000..b9602e7 --- /dev/null +++ b/Documentation/Authentication.md @@ -0,0 +1,83 @@ +# Authentication + +To run the Google BigQuery™ client library, you must first set up authentication by creating or getting access to a Google cloud service account. The credentials(key) for the service account have to be saved as an environment variable on the local system. + +*Note*: You need to set environment variables before starting a MATLAB instance for the environment variables to be effective. + +## Getting Service account key: +1. In the [Cloud Console](https://console.cloud.google.com/), navigate to the [Create service account key page](https://console.cloud.google.com/apis/credentials/serviceaccountkey). +2. Select an existing Project or Create a new Project. +3. From the Service account list, select an existing service account or create a new service account. +4. If you have selected a New Service account, key in a name for the Service account name field. +5. From the Role list, select Project > Owner. +(Optional: Cloud Admin manages Roles for users. You will need EDITOR role for writing to cloud storage) + +```Click Create. A JSON file that contains your key downloads to your computer.``` + +## Note: + +The Role field authorizes your service account to access resources such as datasets, jobs etc. If you get permission issues while using this interface in MATLAB, you should look for the Role access for your Service Account within the selected Project. You can view and change this field later by using the [Cloud Console](https://console.cloud.google.com/). If you are developing a production app, specify more granular permissions than ```Project > Owner```.You might need to reach out to your cloud admin for accessing certain Roles. + +For more information, see [BigQuery Roles](https://cloud.google.com/bigquery/docs/access-control#bigquery) for service accounts. + +## Providing authentication credentials to your MATLAB application: +1. Place downloaded JSON file(credentials) at a local directory on your system. e.g.```..\Software\MATLAB\config``` +``` +{ + "type": "service_account", + "project_id": "project-123REDACTED45", + "private_key_id": "1378f5fREDACTED50eb2", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhBZv2fE=\n-----END PRIVATE KEY-----\n", + "client_email": "467REDACTED5389-compute@developer.gserviceaccount.com", + "client_id": "115REDACTED7232", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/46REDACTED5389-compute%40developer.gserviceaccount.com" +} +``` +2. Rename the json file to a more readable format e.g. credentials.json + +3. Add Environment Variable GOOGLE_APPLICATION_CREDENTIALS: + +* UNIX: + +``` +>> export GOOGLE_APPLICATION_CREDENTIALS=../Software/MATLAB/config/credentials.json; +``` + +* WINDOWS: + + Navigate to ```Advanced System Settings >> Environment Variables```1 and add new User variable ```GOOGLE_APPLICATION_CREDENTIALS``` with value "/project/location/Software/MATLAB/config/credentials.json" + +![environment variable](images/Windows_env_var.png) + + Note: This environment variable only applies to your profile. If you need a less persistent way of setting credentials path, you can do so by setting the variables through shell and starting MATLAB from there. + +4. To check whether credentials have been set correctly look for environment variable GOOGLE_APPLICATION_CREDENTIALS as follows +``` +getenv("GOOGLE_APPLICATION_CREDENTIALS") + +ans = + + '..\matlab-google-bigquery\Software\MATLAB\config\credentials.json' +``` + +## Usage + +Note: Make sure you have followed the steps for [building the SDK](Installation.md) and have run the startup script, ```matlab-google-bigquery/Software/MATLAB/startup.m```, before moving ahead. + +Here is how you can create a Google BigQuery client without explicitly mentioning the path to the credentials. The interface, by default, looks for the environment variable and carries out authentication. If the above steps haven't been performed, you might encounter an error. +``` +gbqclient = gcp.bigquery.BigQuery(); +``` + +You can also explicitly pass in a different set of credentials by passing the name(path) of(to) the credentials file as an input argument, as follows. Make sure the file is accessible to MATLAB. +``` +gbqclient = gcp.bigquery.BigQuery('credentials.json') +``` +## Notes: + +1 Used with permission from Microsoft. + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/BasicUsage.md b/Documentation/BasicUsage.md new file mode 100644 index 0000000..fe4fe96 --- /dev/null +++ b/Documentation/BasicUsage.md @@ -0,0 +1,399 @@ +## Basic Usage: + +This library allows one to create a table in BigQuery™ in the following manner: +* From BigQuery results +* By loading data from files +* By loading data from Google Cloud Storage™ objects + +The following sections will focus on creating a BigQuery client within MATLAB and running various kinds of BigQuery jobs such as query,load etc. + +### Access and query an existing BigQuery dataset + +* Interactive queries : Results are expected to be small in size and will be returned as MATLAB variable of datatype ```table```. + +* Batch queries : Results (number of rows) are expected to be large and will be not be returned as a MATLAB variable. Instead the interface allows results to be stored in a temporary BigQuery table. The content of this table can be downloaded to a Google Cloud Storage™ object which can be accessed through MATLAB ```Interface for Google Cloud Storage™```. See sections `Writing large query results` and `Extract query results from destination table to cloud storage bucket` on this page. + +By default, BigQuery runs interactive queries, which means that the query is executed as soon as possible. +BigQuery also offers batch queries. BigQuery queues each batch query on your behalf and starts the query as soon as idle resources are available, usually within a few minutes. + +At a minimum, to run a query job, you must be granted ```bigquery.jobs.create``` permissions. In order for the query job to complete successfully, you must be granted access to the datasets that contain the tables or views referenced by the query. For information on dataset access controls, see [Controlling access to datasets](https://cloud.google.com/bigquery/docs/dataset-access-controls). + +#### Initializing a client + +The first step is to create a client to connect to Google BigQuery Interface. +You can create a client by calling the constructor for `gcp.bigquery.BigQuery` class with or without explicitly providing your credentials as follows: +``` +gbq_client = gcp.bigquery.BigQuery(); +``` +In the above section, the client expects to find a `credentials.json` file on path with credentials for your Google cloud account. If you wish to use different credentials, you could explicitly mention the new credentials as an input parameter to the constructor class. The credentials either need to be on MATLAB path or need to be mentioned along with their path. +``` +gbq_client = gcp.bigquery.BigQuery('google-project-credentials.json'); +``` +#### Running interactive queries for small datasets + +By default, BigQuery runs interactive (on-demand) query jobs, which means that the query is executed as soon as possible. Interactive queries count towards your concurrent rate limit and your daily limit. + +Query results are always saved to either a temporary or permanent table. You can choose whether to append or overwrite data in an existing table or whether to create a new table if none exists with the same name. For more details refer [documentation](https://cloud.google.com/bigquery/docs/running-queries#queries) + +You can run an interactive query with `query` method. The resultant object is of type `tableResult` native to bigquery libraries. +To extract the `tableResult` to a MATLAB `table`, use the `gbq2table` helper function. +``` +% Write your query. +smallquery = 'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'; + +% Build a configuration for running your query +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(smallquery); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +queryJobConfiguration = queryJobConfigurationBuilder.build + +% Run an interactive (synchronous) query +tableResult = gbq_client.query(queryJobConfiguration) + +% Extracting results to MATLAB table (* meant for small query results. Expect latency if results are larger) +mattable = gbq2table(tableResult) +``` +Note: It is recommended to run batch queries for results expected to be in the order of 1000 rows or more. + +#### Running batch queries for large datasets + +BigQuery queues each batch query on your behalf, and starts the query as soon as idle resources are available in the BigQuery shared resource pool. This usually occurs within a few minutes. For more details refer [documentation](https://cloud.google.com/bigquery/docs/running-queries#batch) + +A batch query is referred throughout it's lifecycle through a **JobId**. +`createJobId` method allows unique JobId creation for a batch job. Once a JobId is available `create()` method can be used to create the batch job for excuting the query. Finally for polling and waiting for job completion `wait()` method can be used. + +Here is an example of building a query and a query job: +``` +% Write your query. Be mindful of query size and SQL/SQL Legacy type. +query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40000;"; + +% Use Query configuration Builder to set all parameters such as +% * Query string +% * Query type - such as Legacy SQL +% * Job Priority - Interactive/Batch +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + +% Creating options with which Job should be created +jobField = gcp.bigquery.BigQuery.JobField.values; +jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + +% Creating Job Id +randomJobId = gcp.bigquery.JobId.createJobId(); +jobId = gcp.bigquery.JobId.of(gbq_client.ProjectId,randomJobId) + +% Setting Query configuration and Job Id to JobInfo +jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; + +% Job creation +job = gbq_client.create(jobInfo,jobOptions) + +% Polling for job completion +job.waitFor + +% Setting options for the way you would want query results to be returned +queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + +% Receiving query results as object TableResult (Java datatype) +tableResult = job.getQueryResults(queryResultsOption) +``` + +#### Writing large query results to a BigQuery table + +Normally, queries have a maximum response size. If you plan to run a query that might return larger results, you can: +* In standard SQL, specify a destination table for the query results. +* In legacy SQL, specify a destination table and set the allowLargeResults option. +When you specify a destination table for large query results, you are charged for storing the data. +For more details refer [documentation](https://cloud.google.com/bigquery/docs/writing-results#writing_large_results_using_legacy_sql) + +In the following section `create()` method is used to create a destination dataset to house the destination table for query results. `setDestinationTable()` method of `queryJobconfiguration` object allows a user to set a `TableId` for the destination table. + +Here is an example for setting the destination table and dataset using a queryConfigurationBuilder object: +``` +% Use Query configuration Builder to set all parameters such as +% * Query string +% * Query type - such as Legacy SQL +% * Job Priority - Interactive/Batch +% * Destination TableId and DatasetId - for Permanent storage + +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + +% If storing result in a permanent table within a dataset on cloud. Make sure the dataset name you are passing is of an existing dataset. A table name you provide can be of a non- +% existent Table within the given dataset. + +datasetname = 'newdataset1'; + +% Create a datasetId +projectid = gbq_client.ProjectId; +datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + +% Create datasetInfo +datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + +% Create dataset fields for listing +datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + +% Create datasetOptions with the fields +datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + +% Create a new dataset in your project +dataSet = gbq_client.create(datasetInfo,datasetOption); + +% Creating a tableId for a destination Table within dataset +tableId = gcp.bigquery.TableId.of(datasetname,'newtable1'); + +% Set destination table within a dataset for storing query results permanently +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setDestinationTable(tableId); + +% Build again +queryJobConfiguration = queryJobConfigurationBuilder.build(); + +% Creating options with which Job should be created +jobField = gcp.bigquery.BigQuery.JobField.values; +jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + +% Creating Job Id +randomJobId = gcp.bigquery.JobId.createJobId(); +jobId = gcp.bigquery.JobId.of(gbq_client.ProjectId,randomJobId); + +% Setting Query configuration and Job Id to JobInfo +jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; + +% Job creation +job = gbq_client.create(jobInfo,jobOptions) + +% Polling for job completion +job.waitFor +``` +This query job will write the results to the BigQuery table we set as the destination table while building the QueryJobConfiguration. +To extract the results from this destination BigQuery Table into a file, see the next section on `Extract query results`. + +#### Limitations +In legacy SQL, writing large results is subject to these limitations: +* You must specify a destination table. +* You cannot specify a top-level ORDER BY, TOP or LIMIT clause. Doing so negates the benefit of using allowLargeResults, because the query output can no longer be computed in parallel. +* Window functions can return large query results only if used in conjunction with a PARTITION BY clause. + +#### Extract query results from destination table to cloud storage bucket + +You can export table data by submitting an extract job via the client. Refer [documentation](https://cloud.google.com/bigquery/docs/exporting-data) for more details. BigQuery supports the CSV, JSON and Avro formats for data exports. + +Note: There are some [export limitations](https://cloud.google.com/bigquery/docs/exporting-data#export_limitations) +* You cannot export table data to a local file, to Sheets, or to Drive. The only supported export location is Cloud Storage. +* You can export up to 1 GB of table data to a single file. If you are exporting more than 1 GB of data, use a wildcard to export the data into multiple files. When you export data to multiple files, the size of the files will vary. +* You cannot export nested and repeated data in CSV format. Nested and repeated data is supported for Avro and JSON exports. +* When you export data in JSON format, INT64 (integer) data types are encoded as JSON strings to preserve 64-bit precision when the data is read by other systems. +* You cannot export data from multiple tables in a single export job. + +In the following section `getTable` provides the handle for the destination table and `extract` method triggers the export from table to cloud storage. + +Here is an example of initializing the Google Cloud Storage™ interface for accessing BigQuery table contents: +``` +% Getting a handle for an existing BigQuery table +gbqtable = gbq_client.getTable(datasetname,'newtable1'); + +% Destination file(blob) name expected to be created on Cloud Storage with query results +filename = "tableresult.csv"; + +% Set Google Cloud Storage Libraries on path +run('matlab-google-cloud-storage/Software/MATLAB/startup') + +% Create a Google Cloud Storage client (Authentication steps performed for Bigquery package take care of Cloud Storage package) +% Note: Make sure the set of credentials have Google Cloud Storage API enabled and the required permissions to write to a Bucket +gcstorage = gcp.storage.Storage('credentials.json'); + +% Bucket name of an existing bucket on Google Cloud Storage +% Optional step : If bucket does not exist create one as shown below +bucketname = uniquebucketname; + +% Create bucketInfo and bucketTargetOptions since they are required for +% bucket creation by Google Cloud Storage API +bucketInfo = gcp.storage.BucketInfo.of(uniquebucketname); +bucketTargetOption = gcp.storage.Storage.BucketTargetOption.userProject(gcstorage.projectId); + +% Creating bucket +bucket = gcstorage.create(bucketInfo, bucketTargetOption); + +% Extract Table data to a Blob Object within the Google Cloud Storage Bucket +gbqtable.extract(filename,bucketname) + +% Extract results as a bulk from Cloud Storage to a local path/folder + +% Get MATLAB handle for the Blob object +blobfields = gcp.storage.Storage.BlobField; +blobGetOption = gcp.storage.Storage.BlobGetOption.fields(blobfields); +blob = gcstorage.get(bucketname,filename,blobGetOption) + +% Download content +localdownloadpath = "any/local/directory" +blob.downloadTo(localdownloadpath) +``` + +#### Freeing up resources on cloud + +If not in use, you may want to delete resources to avoid paying for them. +The following section demonstrates deletion of blob, bucket, table and dataset. +Each ```delete``` execution returns a boolean representing success or failure of the deletion. +You can also choose to use ```exists``` to check for existence of any resource. + +``` +% Create BlobId which is an identifier for the object +blobId = gcp.storage.BlobId.of(bucketname,blob.name); + +% Delete Cloud Storage Blob to empty the Bucket +tf = gcstorage.deleteObject(blobId); + +% Create BucketSourceOption object to help Bucket deletion +bucketSourceOption = gcp.storage.Storage.BucketSourceOption.userProject(gcstorage.projectId); + +% Delete Cloud Storage Bucket +tf = gcstorage.deleteObject(bucketname, bucketSourceOption); + +% Delete the BigQuery Table +tf = gbqtable.delete; + +% Delete BigQuery dataset +tf = dataSet.delete(); + +``` + +### Creating a BigQuery table by loading data from a file + +When you load data into BigQuery, you can load data into a new table, or you can append data to an existing table, or you can overwrite a table or partition. You do not need to create an empty table before loading data into it. +You can create the new table and load your data at the same time. When you load data into BigQuery, you can use schema auto-detection. + +The library uses classes `WriteChannelConfiguration` and `WriteChannelConfiguration.Builder` to configure the Bigquery job for writing file data into a BigQuery table. +* For loading data and creating table at the same time `CREATE_DISPOSITON` should be set to `CREATE_IF_NEEDED` +* For appending data to an existing table `WRITE_DISPOSITION` should be set to `WRITE_APPEND` +* For overwriting an existing table `WRITE_DISPOSITION` should be set to `WRITE_TRUNCATE` + +The builtin function `copyfiletobigquery` allows you to perform the copy/write job. + +``` +% Create a client +gbq_client = gcp.bigquery.BigQuery(); + +% Table names for destination tables e.g. files of format csv, parquet and json +csvtablename = 'csvnewtable'; +parquettablename = 'parquetnewtable'; +jsontablename = 'jsonnewtable'; + +% Creating a BigQuery Table while Loading data from a file +csvfilename = 'airlinesmall_1.csv'; + +% Setting ENUMS CREATE_DISPOSITION and WRITTE_DISPOSITION +createdisposition = 'CREATE_IF_NEEDED'; +writedisposition = 'WRITE_TRUNCATE'; + +% Using function copyfiletobigquery to load contents of the csv file to a not formerly existing BigQuery table +% Note: Make sure you have the dataset created before invoking the function below + +copyfiletobigquery(gbq_client,datasetname,csvtablename,csvfilename,createdisposition,writedisposition); + +% To append data to an existing BigQuery Table switch WRITE_DISPOSITION to 'WRITE_APPEND' +writedisposition = 'WRITE_APPEND'; +copyfiletobigquery(gbq_client,datasetname,csvtablename,csvfilename,createdisposition,writedisposition); + +% Similarly for parquet file upload +% Select CREATE_DISPOSITION and WRITE_DISPOSITION appropriately +parquetfilename = 'outages.parquet'; +copyfiletobigquery(gbq_client,datasetname,parquettablename,parquetfilename,createdisposition,writedisposition); + +% Similarly for json file upload +% Select CREATE_DISPOSITION and WRITE_DISPOSITION appropriately +jsonfilename = 'states.json'; +copyfiletobigquery(gbq_client,datasetname,jsontablename,jsonfilename,createdisposition,writedisposition); +``` + +#### Limitations + +Loading data into BigQuery is subject to the some limitations, depending on the location and format of the source data: + +[Limitations on loading local files](https://cloud.google.com/bigquery/docs/loading-data-local#limitations) +[CSV limitations](https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv#limitations) +[JSON limitations](https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-json#limitations) +[Limitations on nested and repeated data](https://cloud.google.com/bigquery/docs/nested-repeated#limitations) + +### Loading data from Google Cloud Storage + +When you load data from Cloud Storage into BigQuery, your data can be in any of the following formats: + +* Comma-separated values (CSV) +* JSON (newline-delimited) +* Avro +* Parquet +* ORC + +Recurring loads from Cloud Storage into BigQuery are supported by the BigQuery Data Transfer Service. + +BigQuery supports loading data from any of the following Cloud Storage storage classes: + +* Standard +* Nearline +* Coldline +* Archive + +When you choose a location for your data, consider colocating Cloud Storage buckets for loading data. If your BigQuery dataset is in a multi-regional location, the Cloud Storage bucket containing the data you're loading must be in a regional or multi-regional bucket in the same location. For example, if your BigQuery dataset is in the EU, the Cloud Storage bucket must be in a regional or multi-regional bucket in the EU. +If your dataset is in a regional location, your Cloud Storage bucket must be a regional bucket in the same location. For example, if your dataset is in the Tokyo region, your Cloud Storage bucket must be a regional bucket in Tokyo. + +`Exception`: If your dataset is in the US multi-regional location, you can load data from a Cloud Storage bucket in any regional or multi-regional location. +https://cloud.google.com/bigquery/docs/loading-data-cloud-storage#overview + +Once you have a Google Cloud Storage Bucket ready and available, you can follow the [documentation for retrieving Cloud Storage URI](https://cloud.google.com/bigquery/external-data-cloud-storage#gcs-uri). +BigQuery does not support source URIs that include multiple consecutive slashes after the initial double slash. Cloud Storage object names can contain multiple consecutive slash ("/") characters. However, BigQuery converts multiple consecutive slashes into a single slash. + +You can query an external data source to load data into a permanent table or a temporary table. Visit [Bigquery documentation](https://cloud.google.com/bigquery/external-data-cloud-storage#table-types) more details. + +Here is an example of loading contents of a Google Cloud Storage object into a permanent BigQuery table. The library uses classes `LoadJobConfiguration` and `LoadJobConfiguration.Builder` to configure the Bigquery job for writing file data into a BigQuery table. The builtin function `gcstogbqtable` allows you to perform the load job. +``` +% Create a client +gbq_client = gcp.bigquery.BigQuery(); + +% Create a dataset (Follow steps in Query Job section) + +% Defining load job destination +csvtablename = "gbqcsvtable"; +parquettablename = "gbqparquettable"; +jsontablename = "gbqjsontable"; + +% Datasource information - Bucket and Objects(Blobs) +uniquebucketname = "existingCloudStorageBucket"; +csvblobname = "filename.csv"; +parquetblobname = "filename.parquet"; +jsonblobname = "filename.json"; + +% Create variables containing Source URIs +csvsourceUri = strcat("gs://", uniquebucketname, '/', csvblobname); +parquetsourceUri = strcat("gs://", uniquebucketname, '/', parquetblobname); +jsonsourceUri = strcat("gs://", uniquebucketname, '/', jsonblobname); + +% Creating a table if one does not exist during the load job and allowing append if one exists +createdisposition = 'CREATE_IF_NEEDED'; +writedisposition = 'WRITE_APPEND'; + +% Loading csv blob content +gcstogbqtable(gbq_client,datasetname,csvtablename,uniquebucketname,csvblobname,createdisposition,writedisposition); + +% Loading parquet blob content +gcstogbqtable(gbq_client,datasetname,parquettablename,uniquebucketname,parquetblobname,createdisposition,writedisposition); + +% Loading JSON blob content +gcstogbqtable(gbq_client,datasetname,jsontablename,uniquebucketname,jsonblobname,createdisposition,writedisposition); + +``` + +#### BigQuery permissions +At a minimum, the following permissions are required to load data into BigQuery. These permissions are required if you are loading data into a new table or partition, or if you are appending or overwriting a table or partition. + +* bigquery.tables.create +* bigquery.tables.updateData +* bigquery.jobs.create + +#### Cloud Storage permissions +To load data from a Cloud Storage bucket, you must be granted storage.objects.get permissions. If you are using a URI wildcard, you must also have storage.objects.list permissions. The predefined Cloud IAM role storage.objectViewer can be granted to provide both: + +* storage.objects.get +* storage.objects.list + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/BigQuerySchema.md b/Documentation/BigQuerySchema.md new file mode 100644 index 0000000..d3096c2 --- /dev/null +++ b/Documentation/BigQuerySchema.md @@ -0,0 +1,143 @@ + ## Big Query Schema Support + +Google BigQuery™ service allows one to specify a table's schema while loading data into it or while create an entirely new and empty table. +A table schema, typically involves each column's `name` and `datatype` and optionally a column's `description` and `mode`. + +Datatype and mode support for a BigQuery dataset schema has been provided below: + +### Data Type +BigQuery standard & legacy SQL, lets you specify the following [datatypes](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#datetime-type) in your schema. + +| Name | Big Query Data type | MATLAB Supported Data type | +| ------------- | ---------------------- | -------------------------- | +| `Integer` | INT64 | int64 | +| `Floating point` | FLOAT64 | double | +| `Numeric` | NUMERIC | double | +| `Boolean` | BOOL | logical | +| `String` | STRING | string | +| `Bytes` | BYTES | int8 | +| `Date` | DATE | datetime | +| `Date/Time` | DATETIME | string | +| `Time` | TIME | duration | +| `Timestamp` | TIMESTAMP | datetime | +| `Struct (Record)` | STRUCT | `` | +| `Geography` | GEOGRAPHY | `` | + +[MATLAB documentation for supported JAVA return datatypes](https://www.mathworks.com/help/releases/R2019b/matlab/matlab_external/handling-data-returned-from-java-methods.html#bvi1br7-2) + +### Handling BigQuery Table Data type Record + +Accessing record fields by explicitly mentioning the record fields in the query. + +Example dataset `bigquery-public-data.samples.github_nested`1 + +![SearchDatasets](Documentation/images/gbqrecord.PNG) + +If an entire record `repository` is queried as follows, the return data type is not supported. +``` +query = 'SELECT repository FROM `bigquery-public-data.samples.github_nested` LIMIT 10;'; + +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(false); +queryJobConfiguration = queryJobConfigurationBuilder.build; + +tableResult = gbq.query(queryJobConfiguration); + +% Extracting query results +mattable = gbq2table(tableResult) + +Warning: no data to return due to unsupported formats or modes + +mattable = + + [] + +``` + +Querying record `repository` and a non-record field `created_at` will return the non-record fields only. + +``` +query = 'SELECT repository, created_at FROM `bigquery-public-data.samples.github_nested` LIMIT 10;'; + +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(false); +queryJobConfiguration = queryJobConfigurationBuilder.build; + +tableResult = gbq.query(queryJobConfiguration); + +% Extracting query results +mattable = gbq2table(tableResult) + +Warning: Some columns have been removed due to unsupported mode or datatype + +mattable = + + 10x1 table + + created_at + ___________________________ + + "2012/03/30 02:17:15 -0700" + "2012/03/30 02:36:01 -0700" + "2012/03/25 06:25:05 -0700" + "2012/03/25 06:32:28 -0700" + "2012/03/24 14:24:31 -0700" + "2012/03/28 07:25:51 -0700" + "2012/03/28 07:37:43 -0700" + "2012/03/27 11:45:08 -0700" + "2012/03/31 15:17:01 -0700" + "2012/03/27 06:16:51 -0700" +``` + +One can access fields within record such as `repository.url` + +``` +query = 'SELECT repository.url, created_at FROM `bigquery-public-data.samples.github_nested` LIMIT 10;'; + +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(false); +queryJobConfiguration = queryJobConfigurationBuilder.build; + +tableResult = gbq.query(queryJobConfiguration); + +% Extracting query results +mattable = gbq2table(tableResult) + +mattable = + + 10x2 table + + url created_at + ________________________________________________ ___________________________ + + "https://github.com/liferay/liferay-plugins" "2012/03/30 02:14:34 -0700" + "https://github.com/plataformatec/simple_form" "2012/03/30 02:48:40 -0700" + "https://github.com/cakephp/datasources" "2012/03/26 13:47:47 -0700" + "https://github.com/ezsystems/ezfind" "2012/03/30 02:57:38 -0700" + "https://github.com/EightMedia/hammer.js" "2012/03/25 06:39:29 -0700" + "https://github.com/saasbook/hw3_rottenpotatoes" "2012/03/24 14:06:47 -0700" + "https://github.com/JetBrains/kotlin" "2012/03/28 07:38:07 -0700" + "https://github.com/php/php-src" "2012/03/27 06:13:51 -0700" + "https://github.com/saasbook/hw4_rottenpotatoes" "2012/03/20 15:40:50 -0700" + "https://github.com/AFNetworking/AFNetworking" "2012/03/20 15:44:47 -0700" + +``` + +### Mode + +BigQuery supports the following [modes](https://cloud.google.com/bigquery/docs/schemas#modes) for table columns. Mode is an optional requirement while specifying table schema. If the mode is unspecified, the column defaults to NULLABLE. + + +Mode | Support | Description | +-------- | -------------- | ---------------------------------------------------------- | +`Nullable` | supported | Column allows NULL values (default) | +`Required` | supported | NULL values are not allowed | +`Repeated` | `` | Column contains an array of values of the specified type | + + +## Notes: + +1 Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 4.0 Attribution License. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) \ No newline at end of file diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md new file mode 100644 index 0000000..f104ba7 --- /dev/null +++ b/Documentation/GettingStarted.md @@ -0,0 +1,77 @@ +## Getting Started + +Once this package is installed and credentials for authentication have been setup, one can begin working with Google BigQuery™ interface. The [Basic Usage](BasicUsage.md) document provides greater details on the functions within this package. + +The following is a simple example of how one can create a Google BigQuery™ client in order to query datasets using MATLAB. This example assumes you have a Google Cloud Service account and have followed the steps in [Installation](Installation.md) and [Authentication](Authentication.md). + +### Creating a BigQuery Client +``` +gbq_client = gcp.bigquery.BigQuery('pfREDACTED05.json') + +gbq_client = + BigQuery with properties: + + ProjectId: 'pfREDACTEDoy' + Handle: [1x1 com.google.cloud.bigquery.BigQueryImpl] + +``` + +### Constructing a BigQuery query +``` +% query +smallquery = 'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'; + +% configuration for query job +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(smallquery); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +queryJobConfiguration = queryJobConfigurationBuilder.build + +queryJobConfiguration = + QueryJobConfiguration with properties: + + Handle: [1x1 com.google.cloud.bigquery.QueryJobConfiguration] + +``` + +### Executing a query +``` +% Gather results of query in a table +tableResult = gbq_client.query(queryJobConfiguration) + +tableResult = + TableResult with properties: + + Handle: [1x1 com.google.cloud.bigquery.TableResult] + +% converting results to a MATLAB table +data_matlab_table = gbq2table(tableResult) + +mattable = + title revision_count + _________________________________________________ ______________ + + "George W. Bush" 43652 + "List of World Wrestling Entertainment employees" 30572 + "Wikipedia" 29726 + "United States" 27432 + "Michael Jackson" 23245 + "Jesus" 21768 + "Deaths in 2009" 20814 + "World War II" 20546 + "Britney Spears" 20529 + "Wii" 20225 + +``` + +For more detailed and advanced functionalities such as making asynchronous queries and creating datasets, please refer to [BasicUsage](BasicUsage.md) + +### Logging +When getting started, debugging can be helpful to get more feedback. Once the client has been created one can set the logging level to verbose as follows: +``` +logObj = Logger.getLogger(); +logObj.DisplayLevel = 'verbose'; +``` +See: [Logging](Logging.md) for more details. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/Installation.md b/Documentation/Installation.md new file mode 100644 index 0000000..a75af5b --- /dev/null +++ b/Documentation/Installation.md @@ -0,0 +1,33 @@ +# Installation + +## Installing on Windows®, macOS® and Linux +The easiest way to install this package and all required dependencies is to clone the top-level repository using: + +```bash +git clone --recursive https://github.com/mathworks-ref-arch/mathworks-gcp-support.git +``` +This is what your top level directory1 should look like: + +![Folder structure](images/folderstructure.PNG) +### Build the matlab-gcp-common SDK for Java components +The dependencies for the `MATLAB interface for Google BigQuery` and other similar connectors are accessed and built using the ```matlab-gcp-common``` as follows: +```bash +cd mathworks-gcp-support/matlab-gcp-common/Software/Java +mvn clean package +``` +More details can be found here: [Build](Rebuild.md) + +Once built, use the ```mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB/startup.m``` function to initialize the interface. +```MATLAB +cd('mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB') +startup +``` +The package is now ready for use. + +As a next step, please refer to [Authentication](Authentication.md) + +## Notes: + +1 Used with permission from Microsoft. + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/Logging.md b/Documentation/Logging.md new file mode 100644 index 0000000..36b537f --- /dev/null +++ b/Documentation/Logging.md @@ -0,0 +1,59 @@ +# Logging - Controlling command output +The Client uses a logging framework which is similar in many regards to the well known log4j framework. It supports logging levels of: +* verbose - detailed messages that are useful during development and testing but are likely to be too detailed in day-to-day usage. +* debug - default level with minimal output, recommended as a default output level. +* warning - warnings indicative of potential problems, messages are displayed in red in the style of a built in MATLAB® warnings. +* error - error messages with critical problems, messages trigger stack trace like output and execution is halted. + +The default console logging level is *debug*. The logging library can log to both the MATLAB console and to a file. By default it logs to the MATLAB console only. One can set the levels used for logging separately for both, thus one could log in detail to a file and in less detail to the console and consult the detailed log only for postmortem purposes. + +Once a Client, which creates a singleton logger object, has been created one can change the default values as follows: +``` +logObj = Logger.getLogger(); +logObj.DisplayLevel = 'verbose'; +write(logObj,'verbose','My verbose message'); +My verbose message +``` + +To enable logging to a file a log file path and name must be set: +``` +% provide a name path for a log file +logObj.LogFile = 'MyLogFile.log'; + +% set the log level for the log file +logObj.LogFileLevel = 'verbose'; +``` +By default a filename is *not* set and no log file is produced. The logging level used in the file output can be set independently as shown. By default this level is set to *warning*. + + +Logger methods are: +* clearMessages(obj) - Clears the log messages currently stored in the Logger object. +* clearLogFile(obj) - Clears the log messages currently stored in the log file. +* write(obj,Level,MessageText) - Writes a message to the log. + +Logger variables are: +* LogFileLevel - The level of log messages that will be saved to the log file. +* DisplayLevel - The level of log messages that will be displayed in the command window. +* LogFile - The file name or path to the log file. If empty, nothing will be logged to file. +* Messages - Structure array containing log messages. +* MsgPrefix - This message prefix may be used in error logging if an errorStruct identifier is not set. + +The errorStruct identifier is a character vector that specifies a component and a mnemonic label for an error or warning. The format of a simple identifier is: component:mnemonic + +A colon separates the two parts of the identifier: component and mnemonic. If the identifier uses more than one component, then additional colons are required to separate them. A message identifier must always contain at least one colon, e.g: +* MATLAB:rmpath:DirNotFound +* MATLAB:odearguments:InconsistentDataType. + +Both the component and mnemonic fields must adhere to the following syntax rules: +* No white space (space or tab characters) is allowed anywhere in the identifier. +* The first character must be alphabetic, either uppercase or lowercase. +* The remaining characters can be alphanumeric or an underscore. +* There is no length limitation to either the component or mnemonic. +* The identifier can also be an empty character vector. + +Messages logged to the console with a level of warning are displayed as if they were native MATLAB warnings and similarly error level messages are displayed as if they were native errors. + +For full details see: *matlab-google-bigquery/Software/MATLAB/app/functions/Logger.m*. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/MATLABDesktop.md b/Documentation/MATLABDesktop.md new file mode 100644 index 0000000..c096de7 --- /dev/null +++ b/Documentation/MATLABDesktop.md @@ -0,0 +1,7 @@ +# MATLAB Desktop + +This package has been designed to work with the MATLAB® Desktop product and this documentation predominantly reflects working in that environment. Please contact MathWorks using the details in the top-level [README](../README.md) with any other questions about how this package can be used in other MATLAB based environments. + +------------- + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/MATLABProductionServer.md b/Documentation/MATLABProductionServer.md new file mode 100644 index 0000000..ac58969 --- /dev/null +++ b/Documentation/MATLABProductionServer.md @@ -0,0 +1,12 @@ +# Use with MATLAB Production Server and MATLAB Compiler + +When using the package with MATLAB Production Server™ or MATLAB Compiler™ one normally uses the respective Compiler GUIs accessible within the MATLAB IDE. +There are three points to note when deploying applications in this way: +1. Paths are normally configured using the *startup.m* script in the */Software/MATLAB/* directory. When deploying an application that calls this package the paths are not configured in that way and the startup script will have no effect. No end user action is required in this regard. + +2. A .jar file can be found in *matlab-gcp-common/Software/MATLAB/lib/jar/*, this file includes the required functionality from the google-cloud-bigquery™ Java SDK. The automatic dependency analysis will not pick this up and it must be added manually as an additional file. + +3. For testing purposes adding the `credentials JSON file` manually just like the jar(mentioned above) is a simple way to include credentials in the deployed code. While the JSON file will be encrypted it will be included in the compiler output which may be shared. This may violate local security polices and best practices. One should consider other approaches of providing credentials to deployed applications. One should also consider avoiding a scenario which involves credentials being included in source code repositories where they may be exposed. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 0000000..005948c --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,25 @@ +# MATLAB® Interface *for Google Cloud BigQuery™* + +Storing and querying massive datasets can be time consuming and expensive without the right hardware and infrastructure. +```BigQuery``` is an enterprise data warehouse that solves this problem by enabling super-fast SQL queries. +This interface allows one to connect to Google BigQuery service and query and transform large datasets. + +To start using the ```matlab-google-bigquery``` package, refer the documentation links provided below: + +## Contents +1. [Installation](Installation.md) +2. [Authentication](Authentication.md) +3. [Schema Support](BigQuerySchema.md) +4. [Getting Started](GettingStarted.md) +5. [Basic Usage](BasicUsage.md) +6. [Unit Tests](RunningUnitTests.md) +7. [Logging](Logging.md) +8. [References](References.md) +9. [Environments](SupportedEnvironments.md) +10. [References](References.md) +11. Appendix + * [Building the SDK](Rebuild.md) + * [Full API documentation](gbqApiDoc.md) + * [Accessing Public Datasets](AccessPublicDataset.md) + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/Rebuild.md b/Documentation/Rebuild.md new file mode 100644 index 0000000..ff6776f --- /dev/null +++ b/Documentation/Rebuild.md @@ -0,0 +1,42 @@ +# Building the Interface + +Before using the interface for Google BigQuery™, it is required to build a jar using Maven™. +The ```matlab-gcp-common``` houses the ```pom.xml``` file with dependencies which can be found in: ```matlab-gcp-common/Software/Java/```. Maven requires that a JDK (Java® 7 or later) is installed and that the *JAVA_HOME* environment variable is set to the location of the JDK. On Windows® the *MAVEN_HOME* environment variable should also be set. Consult the Maven documentation for further details. + +Use the following commands or operating system specific equivalents to perform a maven build of the package's jar file. +``` +$ cd matlab-gcp-common/Software/Java +$ mvn clean verify package +``` + +The pom file currently references version *1.99.0* of the google-cloud-bigquery SDK: +``` + + com.google.cloud + google-cloud-bigquery + 1.99.0 + +``` + +To build with a more recent version of the SDK, amend the pom file to a specific version or use the following syntax to allow maven to select a newer version. Caution, this may result in build or runtime issues. +``` + + com.google.cloud + google-cloud-bigquery + [1.99.0,) + pom + import + +``` + +The output of the build is a JAR file that is placed in ```matlab-gcp-common/Software/MATLAB/lib/jar``` folder for use by MATLAB. + +Once the jar is built, use the ```mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB/startup.m``` function to initialize the interface. +```MATLAB +cd('mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB') +startup +``` +The package is now ready for use. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/References.md b/Documentation/References.md new file mode 100644 index 0000000..bad7886 --- /dev/null +++ b/Documentation/References.md @@ -0,0 +1,10 @@ +# References + +The following links have been referred to for design and development of this API: + +* [google-cloud-bigquery SDK for Java Developer Guide](https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html) +* [Google BigQuery Examples](https://cloud.google.com/bigquery/docs/quickstarts/quickstart-client-libraries) +* [Java 7 Cryptography Extension Unlimited Strength Jurisdiction Policy Files](http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html) + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/RunningUnitTests.md b/Documentation/RunningUnitTests.md new file mode 100644 index 0000000..07fad8b --- /dev/null +++ b/Documentation/RunningUnitTests.md @@ -0,0 +1,39 @@ +# Running Unit Tests + +After completing [Installation steps](Installation.md) and [Authentication steps](Authentication.md), the API setup can be tested using the Unit Tests that come along with this API. + +Before running the tests make sure you have the following: +* A file named as `credentials.json` on path with valid Google Cloud Service Account credentials +* Installed [MATLAB Interface for Google Cloud Storage](https://github.com/mathworks-ref-arch/matlab-google-cloud-storage) +* A Google Cloud Project +* Enabled BigQuery and Cloud Storage APIs on Google cloud console for the Google Cloud Project +* Permissions and ROLES for read/write/list/delete + +Use the following MATLAB commands to run the unit tests: +```MATLAB +cd('mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB') +startup + +cd('test\unit\');runtests() + +ans = + + 1×14 TestResult array with properties: + + Name + Passed + Failed + Incomplete + Duration + Details + +Totals: + 14 Passed, 0 Failed, 0 Incomplete. + 74.7701 seconds testing time. + +``` + +The package is now ready for use. + + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/SupportedEnvironments.md b/Documentation/SupportedEnvironments.md new file mode 100644 index 0000000..49019b9 --- /dev/null +++ b/Documentation/SupportedEnvironments.md @@ -0,0 +1,17 @@ +# Supported Environments + +Th package runs on the operating systems supported by MATLAB: + +* Linux +* Microsoft Windows + +Please see: https://www.mathworks.com/support/requirements/matlab-system-requirements.html + +It has been designed to work on the following environments using release 2018a or later: + +* [MATLAB Desktop](MATLABDesktop.md) +* [MATLAB Production Server & Runtime](MATLABProductionServer.md) + +----------- + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/gbqApiDoc.md b/Documentation/gbqApiDoc.md new file mode 100644 index 0000000..6fa3382 --- /dev/null +++ b/Documentation/gbqApiDoc.md @@ -0,0 +1,1003 @@ +# MATLAB Interface *for Google BigQuery* API documentation + + +## Google BigQuery Interface Objects and Methods: +* @BigQuery +* @BigQueryOptions +* @Dataset +* @DatasetId +* @DatasetInfo +* @ExternalTableDefinition +* @FormatOptions +* @Job +* @JobId +* @JobInfo +* @LoadJobConfiguration +* @Object +* @QueryJobConfiguration +* @Table +* @TableId +* @TableInfo +* @TableResult +* @WriteChannelConfiguration + + + +------ + +## @BigQuery + +### @BigQuery/BigQuery.m +```notalanguage + BIGQUERY Google Big Query Client Library for MATLAB + + Documentation for gcp.bigquery.BigQuery + doc gcp.bigquery.BigQuery + + + + +``` +### @BigQuery/create.m +```notalanguage + CREATE Method to create a bigquery dataset and job + + This method supports creating datasets and jobs. It does not support + creating new bigquery table from scratch with scehma. + Bigquery table creations are supported as a result of queries returning results into a temporary or permanent tables + + create() method depends on options such as `DatasetOption` and + `JobOption` for creating datasets and jobs respectively. Find more about + Options under +gcp/+Bigquery/ + + Usage + + Create a dataset: + + gbq = gcp.bigquery.BigQuery("credentials.json"); + datasetId = gcp.bigquery.DatasetId.of("datasetname"); + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + datasetField = gcp.bigquery.BigQuery.DatasetField.valueOf + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField) + dataset = gbqclient.create(datasetInfo,datasetOption); + + Create a query job: + + gbq = gcp.bigquery.BigQuery("credentials.json"); + jobField = gcp.bigquery.BigQuery.JobField.values; + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + randomJobId = gcp.bigquery.JobId.createJobId(); + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + queryJobConfiguration = queryJobConfigurationBuilder.build; + jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; + job = gbq.create(jobInfo,jobOptions); + + + +``` +### @BigQuery/deleteDataset.m +```notalanguage + DELETEDATASET Method to delete a dataset + + Usage + + gbq = gcp.bigquery.BigQuery() + tf = gbq.deleteDataset('datasetid') + + + +``` +### @BigQuery/deleteTable.m +```notalanguage + DELETETABLE Method to delete a table + + Usage + + gbq = gcp.bigquery.BigQuery() + tf = gbq.deleteTable(TableID) + + + +``` +### @BigQuery/getDataset.m +```notalanguage + GETDATASET Method to request a dataset + + This method will call the Google Big Query project configured to request + a list of projects. + + Usage + + gbq = gcp.bigquery.BigQuery("credentials.json") + dataSet = gbq.getDataset(datasetId); ,where datsetId is of type "gcp.bigquery.DatasetId" + or + dataSet = gbq.getDataset("datasetId"); , where datasetId is of type string or char + + + +``` +### @BigQuery/getJob.m +```notalanguage + GETJOB Method to request an existing job using the jobid + + Usage + + gbq = gcp.bigquery.BigQuery("credentials.json") + job = gbq.getJob(jobId); ,where jobId is of type "gcp.bigquery.JobId" + + or + + job = gbq.getJob("jobId"); , where jobId is of type string or char + + + +``` +### @BigQuery/getTable.m +```notalanguage + GETTABLE Method to request an existing bigquery TABLE + + Usage + + gbq = gcp.bigquery.BigQuery("credentials.json") + gbqtable = gbq.getTable('datasetId','tableId'); + + + +``` +### @BigQuery/listDatasets.m +```notalanguage + LISTDATASETS Method to list the project's datasets + + Usage: + + % create gbq client + gbq = gcp.bigquery.BigQuery("credentials.json"); + + % create options/configs for how to list datasets + datasetListOption1 = ... + gcp.bigquery.BigQuery.DatasetListOption.all/labelFilter/pageSize/pageToken(input); + + datasetList = gbq.listDatasets(datsetListOption1,....,datasetListOptionN); + + + +``` +### @BigQuery/listTables.m +```notalanguage + LISTTABLES Method to list the tables in the dataset + + gbq = gcp.bigquery.BigQuery("credentials.json"); + tableList = gbq.listTables('datasetId'); + + + +``` +### @BigQuery/query.m +```notalanguage + QUERY Method to Run the query associated with the request, using an internally-generated random JobId. + + Usage + + Synchronous/Interactive jobs: + + smallquery = 'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(smallquery); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + queryJobConfiguration = queryJobConfigurationBuilder.build + + tableResult = gbq.query(queryJobConfiguration) + table = gbq2table(tableResult) + + + Asynchronous/Batch query jobs: + + + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40000;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setDestinationTable(tableId); + queryJobConfiguration = queryJobConfigurationBuilder.build + + jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; + job = gbq.create(jobInfo,jobOptions) + job.waitFor + + queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100) + tableResult = job.getQueryResults(queryResultsOption) + + Note: Alternatively query results can be loaded to Google Cloud storage + bucket and downloaded using ExtractJob + + + +``` + +------ + + +## @BigQueryOptions + +### @BigQueryOptions/BigQueryOptions.m +```notalanguage + BigQueryOptions A Google BigQuery Dataset. + + + Usage + + No explicit usage. This class and it's methods are used in the process of + creating a Bigquery client within the class Bigquery + + Documentation for gcp.bigquery.BigQueryOptions + doc gcp.bigquery.BigQueryOptions + + + + +``` + +------ + + +## @Dataset + +### @Dataset/Dataset.m +```notalanguage + DATASET A Google BigQuery Dataset. + Objects of this class are immutable.Dataset adds a layer of service-related functionality over DatasetInfo. + + Usage + + gbq = gcp.bigquery.BigQuery("credentials.json"); + datasetId = gcp.bigquery.DatasetId.of("datasetname"); + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + datasetField = gcp.bigquery.BigQuery.DatasetField.valueOf + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField) + dataset = gbqclient.create(datasetInfo,datasetOption); + + Documentation for gcp.bigquery.Dataset + doc gcp.bigquery.Dataset + + + + +``` +### @Dataset/delete.m +```notalanguage + DELETE Method - deletes current table and returns TRUE or FALSE depending + on success of the deletion + + Usage + + tf = dataset.delete() + + + +``` +### @Dataset/exists.m +```notalanguage + EXISTS Method - checks if current dataset exists and returns boolean + status + + tf = dataset.exists() + + + +``` + +------ + + +## @DatasetId + +### @DatasetId/DatasetId.m +```notalanguage + DATASETID Google BigQuery Dataset identity. + + Usage: + + Create a datasetid for a new dataset on BigQuery + + datasetId = gcp.bigquery.DatasetId.of("datasetname"); + + gbqclient = gcp.bigquery.Bigquery(credentials.json); + projectId = gbqclient.ProjectId; + datasetId = gcp.bigquery.DatasetId.of(projectId,"datasetname"); + + (c) 2020 MathWorks, Inc. + + Documentation for gcp.bigquery.DatasetId + doc gcp.bigquery.DatasetId + + + + +``` + +------ + + +## @DatasetInfo + +### @DatasetInfo/DatasetInfo.m +```notalanguage + DATASETINFO Google BigQuery Dataset information. A dataset is a grouping mechanism that holds zero or more tables. + + Datasets are the lowest level unit of access control. + Google BigQuery does not allow control access at the table level. + + Usage + + gbqclient = gcp.bigquery.Bigquery(credentials.json); + projectId = gbqclient.ProjectId; + datasetId = gcp.bigquery.DatasetId.of(projectId,"datasetname"); + + datasetInfoBuilder = gcp.bigquery.DatasetId.newBuilder(projectId,datasetId); + datasetInfoBuilder = datasetInfoBuilder.setLocation("location"); + datasetInfo = datasetInfoBuilder.build(); + + or + + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + + Documentation for gcp.bigquery.DatasetInfo + doc gcp.bigquery.DatasetInfo + + + + +``` + +------ + + +## @ExternalTableDefinition + +### @ExternalTableDefinition/ExternalTableDefinition.m +```notalanguage + EXTERNALTABLEDEFINITION Creates Table Definition using external data + sources + + Usage + + sourceUri = "gs://bucketName/filename.csv" + formatOptions = gcp.bigquery.FormatOptions.csv() + + 1. ExternalTableDefinitionBuilder = gcp.bigquery.ExternalTableDefinition.newBuilder(sourceUri, formatOptions); + ExternalTableDefinition = ExternalTableDefinitionBuilder.build(); + + 2. ExternalTableDefinition = gcp.bigquery.ExternalTableDefinition.of(sourceUri, formatOptions); + + Documentation for gcp.bigquery.ExternalTableDefinition + doc gcp.bigquery.ExternalTableDefinition + + + + +``` + +------ + + +## @FormatOptions + +### @FormatOptions/FormatOptions.m +```notalanguage + FORMATOPTIONS Base class for Google BigQuery format options. + + This class defines the format of external data used by BigQuery, for either federated tables or load jobs. + Load jobs support the following formats: AVRO, CSV, JSON, ORC, PARQUET + + Usage + + formatOptions = gcp.bigquery.FormatOptions.csv() + + formatOptions = gcp.bigquery.FormatOptions.json() + + formatOptions = gcp.bigquery.FormatOptions.avro() + + formatOptions = gcp.bigquery.FormatOptions.parquet() + + formatOptions = gcp.bigquery.FormatOptions.orc() + + Documentation for gcp.bigquery.FormatOptions + doc gcp.bigquery.FormatOptions + + + + +``` + +------ + + +## @Job + +### @Job/Job.m +```notalanguage + JOB Object to return the status of a job + + Create a query job: + + gbq = gcp.bigquery.BigQuery("credentials.json"); + jobField = gcp.bigquery.BigQuery.JobField.values; + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + randomJobId = gcp.bigquery.JobId.createJobId(); + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + queryJobConfiguration = queryJobConfigurationBuilder.build; + jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; + job = gbq.create(jobInfo,jobOptions); + + The create() method internally calls this class to wrap the Job into a + MATLAB object gcp.bigquery.Job + + Documentation for gcp.bigquery.Job + doc gcp.bigquery.Job + + + + +``` +### @Job/getQueryResults.m +```notalanguage + GETQUERYRESULTS Returns TableResults for an asynchronous query job + + Usage + + % Creating options with which Job should be created + + jobField = gcp.bigquery.BigQuery.JobField.values; + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + + % Creating Job Id + + randomJobId = gcp.bigquery.JobId.createJobId(); + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId) + + % Setting Query configuration and Job Id to JobInfo + + jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; + + % Job creation + + job = gbq.create(jobInfo,jobOptions) + + % Polling for job completion + job.waitFor + + % Get Query Job Results + % Setting options for the way you would want query results to be returned + + queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + + % Receiving query results as object TableResult + + tableResult = job.getQueryResults(queryResultsOption) + + + +``` +### @Job/waitFor.m +```notalanguage + WAITFOR Blocks until this job completes its execution, either failing or succeeding. + + % Creating options with which Job should be created + + jobField = gcp.bigquery.BigQuery.JobField.values; + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + + % Creating Job Id + + randomJobId = gcp.bigquery.JobId.createJobId(); + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId) + + % Setting Query configuration and Job Id to JobInfo + + jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; + + % Job creation + + job = gbq.create(jobInfo,jobOptions) + + % Polling for job completion + job.waitFor + + % Get Query Job Results + % Setting options for the way you would want query results to be returned + + queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + + % Receiving query results as object TableResult + + tableResult = job.getQueryResults(queryResultsOption) + + + +``` + +------ + + +## @JobId + +### @JobId/JobId.m +```notalanguage + JOBID Object to return the job identifier + + Usage + + % Creating a unique and random JobId - type string + % Is used for creating the object JobId as shown below + + jobIdstr = gcp.bigquery.JobId.createJobId(); + + % Examples of creating jobId + + 1. jobIdBuilder = newBuilder() + jobIdBuilder = jobIdBuilder.setLocation("location"); + jobIdBuilder = jobIdBuilder.project("projectid"); + jobId = jobIdBuilder.build; + + 2. jobId = gcp.bigquery.JobId.of() + + 3. jobId = gcp.bigquery.JobId.of(jobIdstr) + + 4. jobId = gcp.bigquery.JobId.of(projectId,jobIdstr) + + Documentation for gcp.bigquery.JobId + doc gcp.bigquery.JobId + + + + +``` + +------ + + +## @JobInfo + +### @JobInfo/JobInfo.m +```notalanguage + JOBINFO Google BigQuery Job information. + + Jobs are objects that manage asynchronous tasks such as running queries, loading data, and exporting data. + Use QueryJobConfiguration for a job that runs a query. + + Usage + + jobInfoBuilder = gcp.bigquery.JobInfo.newBuilder(JobQueryConfiguration) + jobInfo = jobInfoBuilder.build() + + Documentation for gcp.bigquery.JobInfo + doc gcp.bigquery.JobInfo + + + + +``` + +------ + + +## @LoadJobConfiguration + +### @LoadJobConfiguration/LoadJobConfiguration.m +```notalanguage + LOADJOBCONFIGURATION Google BigQuery load job configuration. A load job loads data from one of several formats into a table. Data is provided as URIs that point to objects in Google Cloud Storage. + Load job configurations have JobConfiguration.Type.LOAD type. + + Usage + + % Create builder for LoadJobConfiguration using either of the two methods + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(tableId,sourceUri); + + or + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,sourceUri,formatOptions); + + % Return LoadJobConfiguration by either building the LoadJobConfiguration.Builder or using the of() method in this class + + LoadJobConfiguration = LoadJobConfigurationBuilder.build; + + or + + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(tableId,sourceUri,formatOptions); + + Documentation for gcp.bigquery.LoadJobConfiguration + doc gcp.bigquery.LoadJobConfiguration + + + + +``` + +------ + + +## @Object + +### @Object/Object.m +```notalanguage + OBJECT Root object for GCP.Bigquery + + Copyright 2020 The MathWorks, Inc. + + Documentation for gcp.bigquery.Object + doc gcp.bigquery.Object + + + + +``` + +------ + + +## @QueryJobConfiguration + +### @QueryJobConfiguration/QueryJobConfiguration.m +```notalanguage + QUERYJOBCONFIGURATION Google BigQuery Query Job configuration. A Query Job runs a query against BigQuery data. + + Usage: + + 1. Use QueryJobConfiguration.Builder to build configuration for + queries with custom options + + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + queryJobConfiguration = queryJobConfigurationBuilder.build() + + 2. Use QueryJobConfiguration to set default configuration for queries + + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfiguration = gcp.bigquery.QueryJobConfiguration.of(query); + + Documentation for gcp.bigquery.QueryJobConfiguration + doc gcp.bigquery.QueryJobConfiguration + + + + +``` + +------ + + +## @Table + +### @Table/Table.m +```notalanguage + TABLE A Google BigQuery Table. + + Documentation for gcp.bigquery.Table + doc gcp.bigquery.Table + + + + +``` +### @Table/delete.m +```notalanguage + DELETE Method - deletes current table + + tf = gbqtable.delete() + + + +``` +### @Table/exists.m +```notalanguage + EXISTS Method - checks if current table exists + + tf = gbqtable.exists() + + + +``` +### @Table/extract.m +```notalanguage + EXTRACT Method - Starts a BigQuery Job to extract the current table to the provided destination URI. Returns the started Job object. + + filename = "mydata.csv"; + gcsbucketname = "my_bucket"; + job = table.extract(filename, gcsbucketname); + + + +``` +### @Table/load.m +```notalanguage + LOAD Starts a BigQuery Job to load data into the current table from the provided source URIs. + + For instance, loading data from Google cloud storage bucket + + Input Arguments: + * bigquery table + * format of the source file (See FormatOptions for more details) + * source Uri e.g. "gs://my_bucket/filename1.csv" + * Job Option + + + +``` + +------ + + +## @TableId + +### @TableId/TableId.m +```notalanguage + TABLEID Returns TableId for a BigQuery Table + + Usage + + tableId = gcp.bigquery.Table.of("DatasetId","TableId") + + Documentation for gcp.bigquery.TableId + doc gcp.bigquery.TableId + + + + +``` + +------ + + +## @TableInfo + +### @TableInfo/TableInfo.m +```notalanguage + TABLEINFO Google BigQuery table information. + + Usage + + sourceUri = "gs://bucketName/filename.csv" + formatOptions = gcp.bigquery.FormatOptions.csv() + + externalTableDefinition = gcp.bigquery.ExternalTableDefinition.of(sourceUri, formatOptions); + tableInfo = of(tableId,externalTableDefinition) + + Documentation for gcp.bigquery.TableInfo + doc gcp.bigquery.TableInfo + + + + +``` + +------ + + +## @TableResult + +### @TableResult/TableResult.m +```notalanguage + TABLERESULT Query results from BigQuery + + This class is used as a holder for gbq.query() and job.getQueryResults() methods return object + + Usage + + tableResult = gbq.query(queryJobConfiguration) + + tableResult = job.getQueryResults(queryResultsOption) + + Documentation for gcp.bigquery.TableResult + doc gcp.bigquery.TableResult + + + + +``` + +------ + + +## @WriteChannelConfiguration + +### @WriteChannelConfiguration/WriteChannelConfiguration.m +```notalanguage + WRITECHANNELCONFIGURATION Google BigQuery Configuration for a load operation. + + A load configuration can be used to load data into a table with a WriteChannel (BigQuery.writer(WriteChannelConfiguration)). + This class is in implicit usage within the function "copyfiletobigquery" + + Usage + + % Set configurations such as formatOption and detection of format overwriting permissions + % and others while loading data from any source to a bigquery table + + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setFormatOptions(formatOptions); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); + + % Settings for creating a table if none exist and overwriting/appending to a table if it already exists + + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createdisposition); + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writedisposition); + + % Assign the above settings of create and write disposition to the writeChannelCongfigurationBuilder + + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setCreateDisposition(createDispositionConfig); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setWriteDisposition(writeDispositionConfig); + + % Build the above config + + writeChannelConfiguration = writeChannelConfigurationBuilder.build; + + % Create a writer object using the above configuration + + writer = gbq.Handle.writer(writeChannelConfiguration.Handle); + + % Create channel stream for writer to write in + + import java.nio.channels.Channels + stream = Channels.newOutputStream(writer); + + % Get file path to the local source + + import java.nio.file.FileSystems + path = which(filename); + splits = strsplit(path,filesep); + fileartifact = splits{end}; + pathartifact = fullfile(splits{1:end-1}); + javafilepath = FileSystems.getDefault().getPath(pathartifact,fileartifact); + + % Run file copy job + import java.nio.file.Files + Files.copy(javafilepath, stream); + + % Close writer + writer.close + + % Get Job handle for the bigquery copy job + job = writer.getJob(); + + Documentation for gcp.bigquery.WriteChannelConfiguration + doc gcp.bigquery.WriteChannelConfiguration + + + + +``` + +------ + +## Google BigQuery Interface Related Functions: +### functions/Logger.m +```notalanguage + Logger - Object definition for Logger + --------------------------------------------------------------------- + Abstract: A logger object to encapsulate logging and debugging + messages for a MATLAB application. + + Syntax: + logObj = Logger.getLogger(); + + Logger Properties: + + LogFileLevel - The level of log messages that will be saved to the + log file + + DisplayLevel - The level of log messages that will be displayed + in the command window + + LogFile - The file name or path to the log file. If empty, + nothing will be logged to file. + + Messages - Structure array containing log messages + + Logger Methods: + + clearMessages(obj) - Clears the log messages currently stored in + the Logger object + + clearLogFile(obj) - Clears the log messages currently stored in + the log file + + write(obj,Level,MessageText) - Writes a message to the log + + Examples: + logObj = Logger.getLogger(); + write(logObj,'warning','My warning message') + + + + +``` +### functions/copyfiletobigquery.m +```notalanguage + COPYFILETOBIGQUERY copies any local file content to a bigquery table + + Input arguments expected: + * Existing BigQuery dataset + * Existing or new destination Table located within the above dataset + * Filename of the local csv, parquet, new line json, avro or orc file on + MATLAB path or fully qualified path + * ENUM for createDisposition (see details below) + * ENUM for writedisposition (see details below) + + ENUMS for createdisposition + --------------------------- + * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. + + * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. + + ENUMS for writedisposition + -------------------------- + * WRITE_APPEND : Configures the job to append data to the table if it already exists. + + * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. + + * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. + + + + +``` +### functions/gbq2table.m +```notalanguage + GBQ2TABLE Returns bigquery tableResults formatted into a structured MATLAB table + + + +``` +### functions/gbqroot.m +```notalanguage + GBQROOT returns location of tooling + + + +``` +### functions/gcstogbqtable.m +```notalanguage + GCSTOGBQTABLE copies content of a file located in Google Cloud Storage bucket to a bigquery table + + Input arguments expected: + * Existing BigQuery dataset + * Existing or new destination Table located within the above dataset + * Bucket name of the Google Cloud Storage Bucket containing the file + * Bucket object or filename within the bucket (csv, parquet, newline json, avro or orc file formats are supported) + Note: If you have subfolder structure for organizing blobs pass folder + path within bucket e.g. "subfolder1/subfolder2/myfile.csv" + * ENUM for createDisposition (see details below) + * ENUM for writedisposition (see details below) + + ENUMS for createdisposition + --------------------------- + * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. + + * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. + + ENUMS for writedisposition + -------------------------- + * WRITE_APPEND : Configures the job to append data to the table if it already exists. + + * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. + + * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. + + + + +``` + + + +------------ + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Documentation/images/Windows_env_var.png b/Documentation/images/Windows_env_var.png new file mode 100644 index 0000000..67e7e18 Binary files /dev/null and b/Documentation/images/Windows_env_var.png differ diff --git a/Documentation/images/folderstructure.PNG b/Documentation/images/folderstructure.PNG new file mode 100644 index 0000000..90d8e6c Binary files /dev/null and b/Documentation/images/folderstructure.PNG differ diff --git a/Documentation/images/gbqrecord.PNG b/Documentation/images/gbqrecord.PNG new file mode 100644 index 0000000..ea8fa21 Binary files /dev/null and b/Documentation/images/gbqrecord.PNG differ diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..542e98f --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,17 @@ +MATHWORKS CLOUD REFERENCE ARCHITECTURE LICENSE + +The files in this GitHub repository refer to commercial software products and services, virtual machine images, and related materials of The MathWorks, Inc. (“MathWorks Programs”). MathWorks Programs are separately licensed under the MathWorks Software License Agreement, available in the desktop installation of the MathWorks Programs or in the virtual machine image. The files in this GitHub repository may also refer to third-party software licensed under separate terms provided by such third parties. + +The following license terms apply only to the files in this GitHub repository, including files in this folder and its subfolders, and do not apply to MathWorks Programs. References to “software” and “code” in the following license terms refer to the files in this GitHub repository. + +Copyright (c) 2020, The MathWorks, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. In all cases, the software is, and all modifications and derivatives of the software shall be, licensed to you solely for use in conjunction with MathWorks products and service offerings. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6054109 --- /dev/null +++ b/README.md @@ -0,0 +1,221 @@ +# MATLAB® Interface *for Google Cloud BigQuery™* + +This is a MATLAB® interface for querying datasets using the Google Cloud BigQuery™ services. + +## Requirements +### MathWorks products +* Requires MATLAB release R2018a or later. +* Install [Google Cloud Common](https://github.com/mathworks-ref-arch/matlab-gcp-common) + +### 3rd party products +* Access to a Google Cloud Platform Services account + +To build the Java SDK, install the following: +* [Maven](https://maven.apache.org/) +* JDK 8 + +## Getting Started +Please refer to the [Documentation](Documentation/README.md) to get started. +The instructions for [Installation](Documentation/Installation.md) and [Getting Started](Documentation/GettingStarted.md) documents provide detailed steps for setting up and using this interface. + +The easiest way to fetch this repo and all required dependencies, is to clone the top-level repository using: + +```bash +git clone --recursive https://github.com/mathworks-ref-arch/mathworks-gcp-support.git +``` + +This is what your top level directory1 should look like: + +![Folder structure](Documentation/images/folderstructure.PNG) + + +### Steps for setting up the google-cloud-bigquery SDK + +The MATLAB connector for Google BigQuery uses a single JAVA SDK which can be built as follows: +```bash +cd mathworks-gcp-support/matlab-gcp-common/Software/Java +mvn clean package +``` + +Once the above SDK is built, use the ```mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB/startup.m``` function to initialize the interface. +```MATLAB +cd('mathworks-gcp-support/matlab-google-bigquery/Software/MATLAB') +startup +``` +Google service account credentials need to be downloaded. For obtaining credentials and ```setting up authentication``` refer [Authentication](Documentation/Authentication.md) + +### Quickstart + +This is a quickstart for using the interface to BigQuery. More detailed examples can be found in [BasicUsage](Documentation/BasicUsage.md) + +```MATLAB +% Create a BigQuery client + +gbq = gcp.bigquery.BigQuery(); + + +gbq = + + BigQuery with properties: + + ProjectId: 'pfREDACTEDoy' + Handle: [1x1 com.google.cloud.bigquery.BigQueryImpl] + +% Create a query and set configurations for the query using a QueryJobConfiguration$Builder + +query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 400;"; +queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); + +queryJobConfigurationBuilder = + + Builder with properties: + + Handle: [1x1 com.google.cloud.bigquery.QueryJobConfiguration$Builder] + +% Build the queryJobConfiguration once all the configurations are set + +queryJobConfiguration = queryJobConfigurationBuilder.build; + +queryJobConfiguration = + + QueryJobConfiguration with properties: + + Handle: [1x1 com.google.cloud.bigquery.QueryJobConfiguration] + +% Build a BigQuery job for making the query + +% Job attributes of interest can be selected in the array of JobFields + +jobField = gcp.bigquery.BigQuery.JobField.values; + +jobField = + + JobField with properties: + + Handle: [8×1 com.google.cloud.bigquery.BigQuery$JobField[]] + +% Job Options for the BigQuery Job +jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + +jobOptions = + + JobOption with properties: + + Handle: [1×1 com.google.cloud.bigquery.BigQuery$JobOption] + +% Create a unique JobId + +jobId = gcp.bigquery.JobId.of(); + +jobId = + + JobId with properties: + + ProjectId: 'pfREDACTEDoy' + Handle: [1×1 com.google.cloud.bigquery.AutoValue_JobId] + + +% Use queryJobConfiguration and jobID as a part of JobInfo + +jobInfoBuilder = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration); +jobInfoBuilder = jobInfoBuilder.setJobId(jobId); + +jobInfoBuilder = + + Builder with properties: + + Handle: [1×1 com.google.cloud.bigquery.JobInfo$BuilderImpl] + + +jobInfo = jobInfoBuilder.build; + +jobInfo = + + JobInfo with properties: + + Handle: [1×1 com.google.cloud.bigquery.JobInfo] + +% Create a bigquery Job + +job = gbq.create(jobInfo,jobOptions); + +job = + + Job with properties: + + Handle: [1×1 com.google.cloud.bigquery.Job] + +% Settings for receiving query results from the job can be set using QueryResultsOption + +queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + +queryResultsOption = + + QueryResultsOption with properties: + + Handle: [1×1 com.google.cloud.bigquery.BigQuery$QueryResultsOption] + +% Extract Query Results into a BigQuery TableResult object + +tableResult = job.getQueryResults(queryResultsOption); + +tableResult = + + TableResult with properties: + + Handle: [1x1 com.google.cloud.bigquery.TableResult] + + +% Extract results into a MATLAB table + +resultTable = gbq2table(tableResult); + +% preview the top rows + +head(resultTable) + +ans = + + 8x5 table + + title comment contributor_ip timestamp num_characters + _____________________________ _________________________________________________________________________________________________________________________________________________________________________________________________________ ________________ __________ ______________ + + "Varna" "/* Organized crime */" "216.254.71.25" 1.1763e+09 38617 + "Carl Phillips" "/* Works */" "67.120.85.133" 1.1601e+09 2535 + "Queen (band)" "/* Documentary */" "195.93.21.98" 1.1359e+09 44438 + "List of rock instrumentals" "/* Walter Giardino */" "200.45.16.104" 1.2276e+09 1.8945e+05 + "Luis Eduardo Aute" "/* References */" "112.201.183.85" 1.263e+09 5719 + "Short circuit" "edit" "170.170.59.138" 1.2581e+09 7652 + "Alexandroupoli" "The reason for removal is that there is absolutely no reason to add the Turkish name. If so we should ass Korean, German, etc names also. Adding Turkish names,especially at the start gives wrong impr" "87.202.148.235" 1.1783e+09 8102 + "Order of the Holy Sepulchre" "/* Grand Master of the Order */" "66.82.9.99" 1.2205e+09 13713 + + +``` + +For an end to end example refer ```Software/MATLAB/script/Examples``` + +## Logging +When getting started or debugging it can be helpful to get more feedback. Once the client has been created one can set the logging level to verbose as follows: +``` +logObj = Logger.getLogger(); +logObj.DisplayLevel = 'verbose'; +``` +See: [Logging](Documentation/Logging.md) for more details. + +## License +The license for the MATLAB Interface *for Google BigQuery* is available in the [LICENSE.md](LICENSE.md) file in this GitHub repository. This package uses certain third-party content which is licensed under separate license agreements. See the [pom.xml](https://github.com/mathworks-ref-arch/matlab-gcp-common/blob/master/Software/Java/pom.xml) + +## Enhancement Request +Provide suggestions for additional features or capabilities using the following link: +https://www.mathworks.com/products/reference-architectures/request-new-reference-architectures.html + +## Support +Email: `mwlab@mathworks.com` or please log an issue. + +## Notes: + +1 Used with permission from Microsoft. + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/RELEASENOTES.md b/RELEASENOTES.md new file mode 100644 index 0000000..9069498 --- /dev/null +++ b/RELEASENOTES.md @@ -0,0 +1,7 @@ +# MATLAB Interface *for Google BigQuery™* +# Release Notes + +## Release 0.1.0 (Oct 2020) +Initial release to github.com + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..4e0339d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,8 @@ +# Reporting Security Vulnerabilities + +If you believe you have discovered a security vulnerability, please report it to +[security@mathworks.com](mailto:security@mathworks.com). Please see +[MathWorks Vulnerability Disclosure Policy for Security Researchers](https://www.mathworks.com/company/aboutus/policies_statements/vulnerability-disclosure-policy.html) +for additional information. + +[//]: # (Copyright 2020 The MathWorks, Inc.) diff --git a/Software/MATLAB/app/functions/Logger.m b/Software/MATLAB/app/functions/Logger.m new file mode 100644 index 0000000..df57b52 --- /dev/null +++ b/Software/MATLAB/app/functions/Logger.m @@ -0,0 +1,470 @@ +classdef Logger < handle + % Logger - Object definition for Logger + % --------------------------------------------------------------------- + % Abstract: A logger object to encapsulate logging and debugging + % messages for a MATLAB application. + % + % Syntax: + % logObj = Logger.getLogger(); + % + % Logger Properties: + % + % LogFileLevel - The level of log messages that will be saved to the + % log file + % + % DisplayLevel - The level of log messages that will be displayed + % in the command window + % + % LogFile - The file name or path to the log file. If empty, + % nothing will be logged to file. + % + % Messages - Structure array containing log messages + % + % Logger Methods: + % + % clearMessages(obj) - Clears the log messages currently stored in + % the Logger object + % + % clearLogFile(obj) - Clears the log messages currently stored in + % the log file + % + % write(obj,Level,MessageText) - Writes a message to the log + % + % Examples: + % logObj = Logger.getLogger(); + % write(logObj,'warning','My warning message') + % + + % Copyright 2020 The MathWorks, Inc. + % + % --------------------------------------------------------------------- + + %% Public properties + % These properties can be read or written to from outside the methods + % of this object. + properties + LogFileLevel = 'warning' %Log message level for messages to be saved + DisplayLevel = 'debug' %Log message level for messages to be displayed in the command window + LogFile = '' %Name or path to the log file + MsgPrefix = 'LOGGER:prefix' %prefix used for warning and error messages + end + + %% Read-only properties + % These properties are read-only, meaning they may be set only within + % methods of this object. + properties (SetAccess=protected, GetAccess=public) + Messages = struct('Timestamp',{},'LevelIndex',{},'LevelName',{},'Message',{},'ErrorDetails',{}) + end + + %% Hidden properties + % These properties are hidden values that may be needed by the class + % methods, but do not need to be exposed as gettable or settable + % properties. + properties (SetAccess=protected, GetAccess=protected) + FileId + end + + %% Constants + % These properties are constant values for this object. The value can + % not be changed. + properties (Constant=true) + % These are the different debugging levels, sorted from lowest to + % highest severity + ValidLevels = { + 'verbose' + 'debug' + 'warning' + 'error' + } + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Constructor + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % A constructor method is a special function that creates an instance + % of the class. Typically, constructor methods accept input arguments + % to assign the data stored in properties and always return an + % initialized object. + % + % This constructor is set to private to create a singleton class. This + % is to allow only one instance of the Logger, which + % can be retrieved from anywhere in the MATLAB session. + methods (Access = private) + function obj = Logger() + end + end %methods + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Destructor + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods + function delete(obj) + % If a log file was open, close it + if ~isempty(obj.FileId) + Status = fclose(obj.FileId); + % Warn if the file could not be closed + if Status~=0 + warning('Logger:CloseFile',... + 'Unable to close log file ''%s''.\n',... + obj.LogFile); + end + end + end + end %methods + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Static Methods + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Static methods are associated with a class, but not with specific + % instances of that class. These methods do not perform operations on + % individual objects of a class and, therefore, do not require an + % instance of the class as an input argument, like ordinary methods. + methods (Static = true) + function obj = getLogger() + % This method returns the singleton logger object. Only one + % logger is allowed in a MATLAB session, and this method will + % retrieve it. + + persistent SingletonLogger + + % Does the Logger need to be instantiated? + if isempty(SingletonLogger) || ~isvalid(SingletonLogger) + SingletonLogger = Logger; + end + + % Output the logger + obj = SingletonLogger; + + end + + function log(varargin) + logObj = Logger.getLogger(); + write(logObj, varargin{:}); + end + + function warning(varargin) + Logger.log('warning', varargin{:}); + end + + function debug(varargin) + Logger.log('debug', varargin{:}); + end + + function verbose(varargin) + Logger.log('verbose', varargin{:}); + end + + function error(varargin) + % Expect an MException to be returned if so catch it and throw as the + % caller to keep logger entries out of the console output + try + Logger.log('error', varargin{:}); + catch ME + throwAsCaller(ME); + end + end + + end %static methods + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Public Methods + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods are functions that implement the operations performed on + % objects of a class. They may be stored within the classdef file or as + % separate files in a @classname folder. + methods + + function clearMessages(obj) + % clearMessages - Method to clear messages in the Logger + % ------------------------------------------------------------------------- + % Abstract: Clears the log messages currently stored in the + % Logger object + % + % Syntax: + % logObj.clearMessages(Level) + % clearMessages(logObj) + % + % Inputs: + % logObj - Logger object + % + % Outputs: + % none + % + + obj.Messages(:) = []; + + end + + function clearLogFile(obj) + % clearLogFile - Method to clear messages in the log file + % ------------------------------------------------------------------------- + % Abstract: Clears the log messages currently stored in the log + % file + % + % Syntax: + % logObj.clearLogFile(Level) + % clearLogFile(logObj) + % + % Inputs: + % logObj - Logger object + % + % Outputs: + % none + % + + % Close the log file + obj.closeLogFile(); + + % Open the log file again and overwrite + openLogFile(obj,obj.LogFile,'w'); + + end + + + function write(obj,Level,MessageText,varargin) + % write - Method to write messages to the Logger + % ------------------------------------------------------------------------- + % Abstract: Adds a new message to the Logger, with the + % specified message level and text + % + % Syntax: + % logObj.write(Level,MessageText) + % write(logObj,Level,MessageText) + % write(logObj,Level,MessageText,myException) + % + % Inputs: + % logObj - Logger object + % Level - Message level string ('debug','warning',etc) + % MessageText - Message text string + % myException - A previously caught or created exception + % + % Outputs: + % none + % + % Examples: + % logObj = Logger.getLogger; + % write(logObj,'warning','My warning message') + % + + % Validate the level is one of the valid levels + Level = validatestring(Level,obj.ValidLevels); + + % Get the level of this message + idxLevel = find(strcmp(Level,obj.ValidLevels),1); + + if length(varargin) == 1 + if isa(varargin{1}, 'MException') + loggedException = varargin{1}; + else + error('Invalid argument: Expected an MException'); + end + else + % if an MException is not passed set it to empty + loggedException = []; + end + + % Save the message to the log + NewMessage = struct(... + 'Timestamp',now,... + 'LevelIndex',idxLevel,... + 'LevelName',Level,... + 'Message',MessageText,... + 'ErrorDetails',loggedException); + obj.Messages(end+1) = NewMessage; + + % Process the messages if the message is an error then an exception + % will be thrown which will be thrown as caller from this method + % of the Logger method to avoid entries from the Logger itself + try + obj.processMessage(NewMessage); + catch ME + throwAsCaller(ME); + end + end + + end %public methods + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Protected Methods + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Protected methods operate on the data in the object, but they can + % only be called from other methods of the class or subclass. + methods (Access = protected) + + function processMessage(obj,NewMessage) + % Called from write() + % Handle the file logging first as if an error throwing the error + % will halt execution and the file logging (if enabled) will not + % happen + % Should the message be written to the log file? + FileLevelIdx = find(strcmp(obj.LogFileLevel,obj.ValidLevels),1); + if NewMessage.LevelIndex>=FileLevelIdx && ~isempty(obj.FileId) + % Create a comma delimited message, followed by a + % line terminator + fprintf(obj.FileId,'%s, %s, "%s"\r\n',... + datestr(NewMessage.Timestamp),... %current date & time + upper(NewMessage.LevelName),... %uppercase level string + NewMessage.Message); %message as quoted string + if strcmpi(NewMessage.LevelName,'error') + if ~isempty(NewMessage.ErrorDetails) + % If there an exception has been passed in log its message + % and stack trace + fprintf(obj.FileId,'ID: %s, message: "%s"\r\n',... + NewMessage.ErrorDetails.identifier,... + NewMessage.ErrorDetails.message); + for n = 1:numel(NewMessage.ErrorDetails.stack) + fprintf(obj.FileId,'ID: %s, file: %s, name: %s, line: %d\r\n',... + NewMessage.ErrorDetails.identifier,... + NewMessage.ErrorDetails.stack(n).file,... + NewMessage.ErrorDetails.stack(n).name,... + NewMessage.ErrorDetails.stack(n).line); + end + end + end + end + + % Should the message be displayed in the command window? + DispLevelIdx = find(strcmp(obj.DisplayLevel,obj.ValidLevels),1); + if NewMessage.LevelIndex>=DispLevelIdx + % If the level is 'warning' display it as a warning i.e. in red text + if strcmpi(NewMessage.LevelName, 'warning') + % Temporarily save the warning state, disable backtraces to remove references + % to the logger from output, issue the warning and restore the warning state + tmpWarningStruct = warning; + warning('off', 'backtrace'); + warning([obj.MsgPrefix, ' ', NewMessage.Message]); + warning(tmpWarningStruct); + elseif strcmpi(NewMessage.LevelName, 'error') + % If error level build and exception, make any existing + % exception a Cause and throw the exception + errException = MException(obj.MsgPrefix, NewMessage.Message); + if ~isempty(NewMessage.ErrorDetails) + errException = addCause(errException, NewMessage.ErrorDetails); + end + % Return errException to the top level of the Logger so it can be + % thrown as caller again thus avoiding spurious entries from the + % logger itself + throwAsCaller(errException); + else + % not a warning or an error so just display the message + disp(NewMessage.Message); + end + end + + + end %function processMessage + + + function StatusOk = openLogFile(obj,FileName,OpenType) + + % Was a file name passed in? + if nargin<2 + FileName = obj.FileName; + end + if nargin<3 + OpenType = 'a'; + end + + % Try to open the new log file + try + [fid, Message] = fopen(FileName,OpenType); + + % If it failed to open, display a message + if fid == -1 + Message = sprintf('Unable to open log file ''%s'' for writing: %s\n',... + FileName, Message); + fid = []; + end + + catch err + % If another error occurred, display a message + Message = sprintf('Unable to set log file ''%s'':\n %s\n',... + Value,err.Message); + fid = []; + end + + % Were there any errors? + StatusOk = isempty(Message); + if StatusOk + % Set the new file ID + obj.FileId = fid; + else + warning('Logger:OpenLogFile',... + 'Unable to open log file ''%s''.\n',... + FileName); + end + + end %function [fid, Message] = openFile(FileName) + + + function closeLogFile(obj) + + % If a log file was open, close it + if ~isempty(obj.FileId) + Status = fclose(obj.FileId); + % Warn if the file could not be closed + if Status~=0 + warning('Logger:CloseLogFile',... + 'Unable to close log file ''%s''.\n',... + obj.LogFile); + else + obj.FileId = []; + end + end + + end %function closeFile() + + end %protected methods + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Set Methods + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods + % Set methods customize the behavior that occurs when a property value + % is set. + + function set.LogFileLevel(obj,Value) + + % Validate the setting is one of the valid levels + Value = validatestring(Value,obj.ValidLevels); + obj.LogFileLevel = Value; + + end %function set.LogFileLevel + + + function set.DisplayLevel(obj,Value) + % Validate the setting is one of the valid levels + Value = validatestring(Value,obj.ValidLevels); + obj.DisplayLevel = Value; + + end %function set.DisplayLevel + + + function set.LogFile(obj,Value) + + % Close the old log file + closeLogFile(obj) + + % Open the new log file + StatusOk = openLogFile(obj,Value); + + % Did it open the file successfully? + if StatusOk + % Keep the new log file name + obj.LogFile = Value; + else + % If it failed to open, revert and don't change the file name + openLogFile(obj); + end + + end %function set.LogFile + + end %set methods + +end %classdef diff --git a/Software/MATLAB/app/functions/copyfiletobigquery.m b/Software/MATLAB/app/functions/copyfiletobigquery.m new file mode 100644 index 0000000..253e6a6 --- /dev/null +++ b/Software/MATLAB/app/functions/copyfiletobigquery.m @@ -0,0 +1,139 @@ +function copyfiletobigquery(gbq,datasetname,tablename,filename,createdisposition,writedisposition) +%COPYFILETOBIGQUERY copies any local file content into a bigquery table +% +% Input arguments expected: +% * Bigquery client object +% * Name of an existing BigQuery dataset +% * Name of an existing or new destination Table located within the above dataset +% * Filename of the locally available csv, parquet, new line json, avro or orc file on +% MATLAB path or fully qualified path +% * ENUM for createDisposition (see details below) +% * ENUM for writedisposition (see details below) +% +% ENUMS for createdisposition +% --------------------------- +% * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. +% +% * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. +% +% ENUMS for writedisposition +% -------------------------- +% * WRITE_APPEND : Configures the job to append data to the table if it already exists. +% +% * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. +% +% * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. +% + +% (c) 2020 MathWorks, Inc. + +%% Create destination tableId for copying content into +% datasetname is the name of an existing dataset +% tablename is the name of a new or existing destination table +tableId = gcp.bigquery.TableId.of(datasetname,tablename); + +%% Creating writer channel for copying file content + +% Detect file type with extension +splits = strsplit(filename,'.'); +extension = char(lower(splits{end})); + +% Flag to check supported file format and will be used to execute next +% block of code only if value is 1 +flag = 1; + +% Create formatOptions based on file extension +switch extension + case 'csv' + formatOptions = gcp.bigquery.FormatOptions.csv; + case 'json' + formatOptions = gcp.bigquery.FormatOptions.json; + case 'avro' + formatOptions = gcp.bigquery.FormatOptions.avro; + case 'parquet' + formatOptions = gcp.bigquery.FormatOptions.parquet; + case 'orc' + formatOptions = gcp.bigquery.FormatOptions.orc; + otherwise + warning('Unsupported file format. Supported formats include "csv" , "avro", "orc", "parquet", "json(newline)" only.'); + flag=0; +end + +if isequal(flag,1) + %% Set all configurations for a Bigquery File Copy Job: + % Job configuration object is "writechannelConfiguration" constructed using a + % Builder object "writeChannelConfigurationBuilder" + % + % Set of configurations: + % * destination TableId + % * formatOptions based on extension + % * setAutoDetect to detect source file schema + % * setCreateDisposition 'CREATE_IF_NEEDED' or 'CREATE_NEVER' + % * setWriteDisposition 'WRITE_APPEND', append to existing data or 'WRITE_EMPTY', error out if + % table exists or 'WRITE_TRUNCATE', overwrites existing table + + % Destination tableId is set + writeChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.newBuilder(tableId); + + % Format option based on file extension is set and autodetected + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setFormatOptions(formatOptions); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); + + % Create and Write disposition settings configured + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createdisposition); + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writedisposition); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setCreateDisposition(createDispositionConfig); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setWriteDisposition(writeDispositionConfig); + writeChannelConfiguration = writeChannelConfigurationBuilder.build; + + %% Create table writer + writer = gbq.Handle.writer(writeChannelConfiguration.Handle); + + % Create channel stream for writer to write in + import java.nio.channels.Channels + stream = Channels.newOutputStream(writer); + + % Get file path to the local source + import java.nio.file.FileSystems + path = which(filename); + pathartifact = strrep(path,strcat(filesep,filename),''); + javafilepath = FileSystems.getDefault().getPath(pathartifact,filename); + + % Run file copy job + import java.nio.file.Files + Files.copy(javafilepath, stream); + + % Close writer + writer.close + + % Get Job handle for the bigquery copy job + job = writer.getJob(); + + %% Polling for job completion + + % Importing duration + import org.threeten.bp.Duration + + % Creating duration of 1 sec + d = Duration.ofSeconds(1); + + % Importing RetryOption + import com.google.cloud.RetryOption + + % Initial retry delay of 1 sec + initialretrydelay = javaMethod('initialRetryDelay','com.google.cloud.RetryOption',d); + + % Total timeout of 3 minutes + totalTimeout = RetryOption.totalTimeout(Duration.ofMinutes(3)); + + % Constructing all an array of all retry configurations constructed above + retryOptionArray = javaArray('com.google.cloud.RetryOption',2); + retryOptionArray(1) = initialretrydelay; + retryOptionArray(2) = totalTimeout; + + % Execute Job wait with the retryoptions + job.waitFor(retryOptionArray); +end +% exit function no return value +end + diff --git a/Software/MATLAB/app/functions/gbq2table.m b/Software/MATLAB/app/functions/gbq2table.m new file mode 100644 index 0000000..0285a66 --- /dev/null +++ b/Software/MATLAB/app/functions/gbq2table.m @@ -0,0 +1,206 @@ +function mattable = gbq2table(tableResult) +%GBQ2TABLE Returns tableResults formatted into a structured MATLAB table +%object + +% (c) 2020 MathWorks, Inc. + +% Accessing Java Object from Handle +tableresults = tableResult.Handle; + +% Returns total number of rows, greater than number of rows in a given page +nRows = tableresults.getTotalRows; + +% Accessing schema from tableResults +schema = tableresults.getSchema; + +% Schema contains field names and types for every field value or table +% column +fields = schema.getFields.toArray; + +% Iterating through number of fields (or number of columns) to get Column +% name and Datatype for that column + +% LEGACY SQL TYPE : (https://cloud.google.com/bigquery/data-types#legacy_sql_data_types) +% +% Supported : STRING, BYTES, INTEGER, FLOAT, BOOLEAN, NUMERIC, TIMESTAMP +% UnSupported : RECORD, DATE, TIME, DATETIME (casted as String) + +j = 0; +i = 0; +skipcol = []; +while i < numel(fields) + i = i+1; + fieldobj = fields(i); + mode = fieldobj.getMode; + if ~isequal(string(mode.toString),"REPEATED") + j = j+1; + switch char(fieldobj.getType) + case 'STRING' + variableTypes{j} = 'string' ; %#ok<*AGROW> + schemaTypes{j} = 'string' ; + variableNames{j} = char(fieldobj.getName); + case 'INTEGER' + variableTypes{j} = 'int64' ; + schemaTypes{j} = 'integer' ; + variableNames{j} = char(fieldobj.getName); + case 'BOOLEAN' + variableTypes{j} = 'logical' ; + schemaTypes{j} = 'boolean' ; + variableNames{j} = char(fieldobj.getName); + case 'FLOAT' + variableTypes{j} = 'double' ; + schemaTypes{j} = 'float' ; + variableNames{j} = char(fieldobj.getName); + case 'BYTES' + variableTypes{j} = 'int8' ; + schemaTypes{j} = 'bytes' ; + variableNames{j} = char(fieldobj.getName); + case 'TIMESTAMP' + variableTypes{j} = 'datetime' ; + schemaTypes{j} = 'timestamp' ; + variableNames{j} = char(fieldobj.getName); + case 'DATE' + variableTypes{j} = 'datetime' ; + schemaTypes{j} = 'date' ; + variableNames{j} = char(fieldobj.getName); + case 'TIME' + variableTypes{j} = 'duration' ; + schemaTypes{j} = 'time' ; + variableNames{j} = char(fieldobj.getName); + case 'NUMERIC' + variableTypes{j} = 'double' ; + schemaTypes{j} = 'numeric' ; + variableNames{j} = char(fieldobj.getName); + case 'RECORD' + % unsupported column due to RECORD Datatype + skipcol = [skipcol , i]; + j = j-1; + case 'GEOGRAPHY' + % unsupported column due to RECORD Datatype + skipcol = [skipcol , i]; + j = j-1; + otherwise + % DATETIME + variableTypes{j} = 'string'; + schemaTypes{j} = 'string' ; + variableNames{j} = char(fieldobj.getName); + end + else + skipcol = [skipcol , i]; + + end +end + +% Constructing MATLAB table of size [nRows numel(fields)] +% VariableTypes will be decided by schema.field.type +% VariableNames will be decided by schema.field.name + +if j > 0 +% Table definition +mattable = table('Size',[nRows j],'VariableTypes',variableTypes); +mattable.Properties.VariableNames = variableNames; +if j < i + warning('Some columns have been removed due to unsupported mode or datatype'); +end +% Table construction completed +%% Unpacking values and assigning to MATLAB table + +% Initializing Row counter +rowcount = 0; + +% Iterating through rows +values = tableresults.iterateAll; + +% Iterator object for while loop +valueiterator = values.iterator; + +% Check for next available iteration +% Check Java Performance +% Graph for Table size linearly +% Warning - Best practice - batch job + +while valueiterator.hasNext + + k = 0; %flag + % Row counter for validation + rowcount = rowcount + 1; + + % Extract Column values for current Row + currentrowval = valueiterator.next; + + % Convert column values to array of Objects + currentcolvals = currentrowval.toArray; + + % Delete objects pertaining to indices/columns to be skipped due to + % unsupported mode or datatype + currentcolvals(skipcol)=[]; + i=1; + % Iterating through columns + while i <= numel(currentcolvals) + + % Checking if col is skipped + if ~isempty(currentcolvals(i)) + + % Accessing value that needs to be assigned to + % mattable(rowcount,i) if col exists and not skipped + currentcolval = currentcolvals(i).getValue; + + % Checking if col value extracted is null + if ~isempty(currentcolval) + + % standardizing missing value (optional) + % currentcolval = standardizeMissing(currentcolval,variableTypes{i}); + + k = k+1; + % Checking for Datatype for Table Variable and applying correct + % conversions + switch schemaTypes{k} + case 'string' + mattable{rowcount,k} = string(currentcolval); + + case 'time' + mattable{rowcount,k} = duration(currentcolval); + + case 'integer' + mattable{rowcount,k} = int64(str2double(currentcolval)); + + case 'boolean' + currentcolval = currentcolvals(i).getBooleanValue; + mattable{rowcount,k} = logical(currentcolval); + + case 'float' + mattable{rowcount,k} = str2double(string(currentcolval)); + + case 'numeric' + mattable{rowcount,k} = str2double(string(currentcolval)); + + case 'bytes' + mattable{rowcount,k} = int8(currentcolval); + + case 'timestamp' + mattable{rowcount,k} = datetime(str2double(currentcolval),'ConvertFrom', 'posixtime'); + + case 'date' + mattable{rowcount,k} = datetime(currentcolval); + otherwise + mattable{rowcount,k} = string(currentcolval); + + end % switch (assignment complete) + end % no assignment if value returned is null + else + % warning('Skipping col due to unsupported mode or format '); + + end % if checking columns to be switched + i = i+1; + end % for loop for column fields for every row (next row) + +end % Value iterator for TableResult (iterator exhausted) + +else + if i > 0 + warning('no data to return due to unsupported formats or modes'); + mattable = []; + end +end + +end %function diff --git a/Software/MATLAB/app/functions/gbqroot.m b/Software/MATLAB/app/functions/gbqroot.m new file mode 100644 index 0000000..dc8d95e --- /dev/null +++ b/Software/MATLAB/app/functions/gbqroot.m @@ -0,0 +1,9 @@ +function [out] = gbqroot(varargin) +% GBQROOT returns location of tooling + +% (c) 2020 MathWorks, Inc. + + +out = fileparts(fileparts(fileparts(mfilename('fullpath')))); + +end %function diff --git a/Software/MATLAB/app/functions/gcstogbqtable.m b/Software/MATLAB/app/functions/gcstogbqtable.m new file mode 100644 index 0000000..f41e99e --- /dev/null +++ b/Software/MATLAB/app/functions/gcstogbqtable.m @@ -0,0 +1,145 @@ +function gcstogbqtable(gbq,datasetname,tablename,bucketname,blobname,createdisposition,writedisposition) +%GCSTOGBQTABLE copies content of a file located in Google Cloud Storage bucket into a bigquery table +% +% Input arguments expected: +% * BigQuery client object +% * Name of an existing BigQuery dataset +% * Name of an existing or new destination Table located within the above dataset +% * Bucket name of the Google Cloud Storage Bucket containing the file +% * Bucket object or filename within the bucket (csv, parquet, newline json, avro or orc file formats are supported) +% Note: If you have subfolder structure for organizing blobs pass folder +% path within bucket e.g. "subfolder1/subfolder2/myfile.csv" +% * ENUM for createDisposition (see details below) +% * ENUM for writedisposition (see details below) +% +% ENUMS for createdisposition +% --------------------------- +% * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. +% +% * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. +% +% ENUMS for writedisposition +% -------------------------- +% * WRITE_APPEND : Configures the job to append data to the table if it already exists. +% +% * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. +% +% * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. +% + +% (c) 2020 MathWorks, Inc. + + +% Create destination tableId + +tableId = gcp.bigquery.TableId.of(datasetname,tablename); + +% Constructing source data url + +% Bucket url : gs://bucketname +bucketurl = strcat("gs://",bucketname); + +% Object(file) url : gs://bucketname/myfile.csv +bloburl = strcat(bucketurl,'/',blobname); + +% Detect file type with extension +splits = strsplit(blobname,'.'); +extension = char(lower(splits{end})); + +% Flag to check supported file format and will be used to execute next +% block of code only if value is 1 +flag = 1; + +% Create formatOptions based on file extension +switch extension + case 'csv' + formatOptions = gcp.bigquery.FormatOptions.csv; + case 'json' + formatOptions = gcp.bigquery.FormatOptions.json; + case 'avro' + formatOptions = gcp.bigquery.FormatOptions.avro; + case 'parquet' + formatOptions = gcp.bigquery.FormatOptions.parquet; + case 'orc' + formatOptions = gcp.bigquery.FormatOptions.orc; + otherwise + warning('Unsupported file format. Supported formats include "csv" , "avro", "orc", "parquet", "json(newline)" only.'); + flag=0; +end + +if isequal(flag,1) + %% Create configuration for a table Load Job + % Job configuration object is "loadJobConfiguratio" constructed using a + % Builder object "loadJobConfigurationBuilder" + % + % Set all configurations: + % * destinationTable TableId + % * sourceUri bloburl + % * formatOptions based on extension + % * setAutoDetect to detect source file schema (works only for csv and json) + % * setCreateDisposition 'CREATE_IF_NEEDED' or 'CREATE_NEVER' + % * setWriteDisposition 'WRITE_APPEND', append to existing data or 'WRITE_EMPTY', error out if + % table exists or 'WRITE_TRUNCATE', overwrites existing table + + % Create builder for load job configuration + loadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,bloburl,formatOptions); + + % Set autodetect for csv and json + loadJobConfigurationBuilder = loadJobConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); + + % Set createDisposition and writeDisposition for table creation if non-existent and + % for appending existing table with new data + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createdisposition); + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writedisposition); + loadJobConfigurationBuilder = loadJobConfigurationBuilder.setWriteDisposition(writeDispositionConfig); + loadJobConfigurationBuilder = loadJobConfigurationBuilder.setCreateDisposition(createDispositionConfig); + + % Build loadJobConfigurationbuilder to loadJobConfiguration + loadJobConfiguration = loadJobConfigurationBuilder.build; + + % Creating Job Id + randomJobId = gcp.bigquery.JobId.createJobId(); + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); + + % Use loadJobConfiguration and jobId for creating jobInfo + jobInfoBuilder = gcp.bigquery.JobInfo.newBuilder(loadJobConfiguration); + jobInfoBuilder = jobInfoBuilder.setJobId(jobId); + jobInfo = jobInfoBuilder.build; + + % Crete JobOption object for Job creation + jobfield = gcp.bigquery.BigQuery.JobField.values(); + jobOption = gcp.bigquery.BigQuery.JobOption.fields(jobfield); + + % Job creation + job = gbq.create(jobInfo,jobOption); + + %% Polling for job completion + + % Importing duration + import org.threeten.bp.Duration + + % Creating duration of 1 sec + d = Duration.ofSeconds(1); + + % Importing RetryOption + import com.google.cloud.RetryOption + + % Initial retry delay of 1 sec + initialretrydelay = javaMethod('initialRetryDelay','com.google.cloud.RetryOption',d); + + % Total timeout of 3 minutes + totalTimeout = RetryOption.totalTimeout(Duration.ofMinutes(3)); + + % Constructing all an array of all retry configurations constructed above + retryOptionArray = javaArray('com.google.cloud.RetryOption',2); + retryOptionArray(1) = initialretrydelay; + retryOptionArray(2) = totalTimeout; + + % Execute Job wait with the retryoptions + job.waitFor(retryOptionArray); + +end +end + + + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetDeleteOption/DatasetDeleteOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetDeleteOption/DatasetDeleteOption.m new file mode 100644 index 0000000..37d80c8 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetDeleteOption/DatasetDeleteOption.m @@ -0,0 +1,63 @@ +classdef DatasetDeleteOption < gcp.bigquery.Object +% DATASETDELETEOPTION Class for specifying dataset delete options. +% Returns object of class 'com.google.cloud.bigquery.BigQuery$DatasetDeleteOption' +% +% Usage +% +% % Deletes dataset even if it has contents +% DatasetDeleteOption = gcp.bigquery.BigQuery.DatasetDeleteOption.deleteContents() +% + +% (c) 2020 MathWorks, Inc. + + +properties + +end + +methods + %% Constructor + function obj = DatasetDeleteOption(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of input argument before Handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$DatasetDeleteOption') + write(logObj,'error','DatasetDeleteOption Object creation failed'); + else + % Received expected class of the object and assigning it to the + % Handle for MATLAB class object BigQuery.DatasetDeleteOption + obj.Handle = varargin{1}; + end + + end % constructor +end + +methods(Static) + + + % Returns an option to delete a dataset even if non-empty. + function DatasetDeleteOption = deleteContents() + % imports + import com.google.cloud.bigquery.BigQuery; + + % Create a DatasetDeleteOption No inputs required + DatasetDeleteOptionJ = javaMethod('deleteContents','com.google.cloud.bigquery.BigQuery$DatasetDeleteOption'); + + % Wrapping into a MATLAB class object + DatasetDeleteOption = gcp.bigquery.BigQuery.DatasetDeleteOption(DatasetDeleteOptionJ); + end + +end %methods(Static) + +end %class + +% Java API reference: https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/BigQuery.DatasetDeleteOption.html +% +% Supported Method +% ---------------- +% +% static BigQuery.DatasetDeleteOption deleteContents() +% Returns an option to delete a dataset even if non-empty. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetField/DatasetField.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetField/DatasetField.m new file mode 100644 index 0000000..f763952 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetField/DatasetField.m @@ -0,0 +1,89 @@ +classdef DatasetField < gcp.bigquery.Object +% DATASETFIELD Fields of a BigQuery Dataset resource. +% +% USAGE +% % Will allow just DatasetId to be the field information returned +% datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf() +% +% % Will allow all fields related to Dataset to be returned - +% % Note: Use only if you have enough access +% datasetField = gcp.bigquery.BigQuery.DatasetField.values() + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = DatasetField(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of input arguments before assigning Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$DatasetField[]') + write(logObj,'error','DatasetField Object creation failed'); + else + obj.Handle = varargin{1}; + end + + end +end + +methods(Static) + % Returns an array containing the constants of this enum type, in the order they are declared. + function DatasetField = values() + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetFieldArray here. no input expected + DatasetFieldJ = javaMethod('values','com.google.cloud.bigquery.BigQuery$DatasetField'); + + % wrapping into a MATLAB class object + DatasetField = gcp.bigquery.BigQuery.DatasetField(DatasetFieldJ); + end + + function DatasetField = valuesOf() + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetFieldArray here. no input expected + DatasetFieldJ = javaMethod('valueOf','com.google.cloud.bigquery.BigQuery$DatasetField','ID'); + + % Create an array + DatasetFieldArrayJ = javaArray('com.google.cloud.bigquery.BigQuery$DatasetField',1); + DatasetFieldArrayJ(1) = DatasetFieldJ; + + % wrapping into a MATLAB class object + DatasetField = gcp.bigquery.BigQuery.DatasetField(DatasetFieldArrayJ); + end + +end%methods(Static) + +end %class + +% Java API Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.DatasetField.html +% +% Supported Methods +% ----------------- +% static BigQuery.DatasetField valueOf(String name) +% Returns the enum constant of this type with the specified name. +% +% static BigQuery.DatasetField[] values() +% Returns an array containing the constants of this enum type, in the order they are declared. + +% Enum Constants expected as fields +% --------------------------------- +% ACCESS +% CREATION_TIME +% DATASET_REFERENCE +% DEFAULT_TABLE_EXPIRATION_MS +% DESCRIPTION +% ETAG +% FRIENDLY_NAME +% ID +% LABELS +% LAST_MODIFIED_TIME +% LOCATION +% SELF_LINK \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetListOption/DatasetListOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetListOption/DatasetListOption.m new file mode 100644 index 0000000..8745645 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetListOption/DatasetListOption.m @@ -0,0 +1,107 @@ +classdef DatasetListOption < gcp.bigquery.Object +% DATASETLISTOPTION Class for specifying dataset list options. +% +% Usage +% +% DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption.all() +% +% DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption.labelFilter(labelFilter) +% +% DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption.pageToken(pageToken) +% +% DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption.pageSize(pageSize) +% +% datasetList = gbq.listDatasets(datsetListOption1,....,datasetListOptionN); + +% (c) 2020 MathWorks, Inc. + + +properties + +end + +methods + %% Constructor + function obj = DatasetListOption(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of the input argument before handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$DatasetListOption') + write(logObj,'error','DatasetListOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + + % Returns an options to list all datasets, even hidden ones. + function DatasetListOption = all() + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetListOption. No inputs required + DatasetListOptionJ = javaMethod('all','com.google.cloud.bigquery.BigQuery$DatasetListOption'); + + % wrapping into a MATLAB class object + DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption(DatasetListOptionJ); + end + + % Returns an option to specify a label filter. + function DatasetListOption = labelFilter(labelFilter) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetListOption. labelFilter is expected to be of the type string + DatasetListOptionJ = javaMethod('labelFilter','com.google.cloud.bigquery.BigQuery$DatasetListOption',labelFilter); + + % wrapping into a MATLAB class object + DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption(DatasetListOptionJ); + end + + % Returns an option to specify the page token from which to start listing datasets. + function DatasetListOption = pageToken(pageToken) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetListOption. pageToken is expected to be of the type string + DatasetListOptionJ = javaMethod('pageToken','com.google.cloud.bigquery.BigQuery$DatasetListOption',pageToken); + + % wrapping into a MATLAB class object + DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption(DatasetListOptionJ); + end + + % Returns an option to specify the maximum number of datasets returned per page. + function DatasetListOption = pageSize(pageSize) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetListOption. pageSize is expected to be of the type long + DatasetListOptionJ = javaMethod('pageSize','com.google.cloud.bigquery.BigQuery$DatasetListOption',pageSize); + + % wrapping into a MATLAB class object + DatasetListOption = gcp.bigquery.BigQuery.DatasetListOption(DatasetListOptionJ); + end +end + +end %class + +% Java API Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.DatasetListOption.html +% +% Supported Methods +% ------------------- +% static BigQuery.DatasetListOption all() +% Returns an options to list all datasets, even hidden ones. +% +% static BigQuery.DatasetListOption labelFilter(String labelFilter) +% Returns an option to specify a label filter. +% +% static BigQuery.DatasetListOption pageSize(long pageSize) +% Returns an option to specify the maximum number of datasets returned per page. +% +% static BigQuery.DatasetListOption pageToken(String pageToken) +% Returns an option to specify the page token from which to start listing datasets. diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetOption/DatasetOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetOption/DatasetOption.m new file mode 100644 index 0000000..6314a15 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@DatasetOption/DatasetOption.m @@ -0,0 +1,58 @@ +classdef DatasetOption < gcp.bigquery.Object +% DATASETOPTION Class for specifying dataset get, create and update options. +% +% USAGE +% +% datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf() +% datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField) + +% (c) 2020 MathWorks, Inc. + + +properties + +end + +methods + %% Constructor + function obj = DatasetOption(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of input arguments before handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$DatasetOption') + write(logObj,'error','DatasetOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + + % Returns an option to specify the dataset's fields to be returned by the RPC call. + function DatasetOption = fields(fields) + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetOption. Required DatasetField object as input + DatasetOptionJ = javaMethod('fields','com.google.cloud.bigquery.BigQuery$DatasetOption', fields.Handle); + + % Wrapping into a MATLAB class object + DatasetOption = gcp.bigquery.BigQuery.DatasetOption(DatasetOptionJ); + + end + +end % methods(Static) + +end %class + +% Java API Reference : https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.DatasetOption.html +% +% Supported method +% ----------------- +% +% static BigQuery.DatasetOption fields(BigQuery.DatasetField... fields) +% Returns an option to specify the dataset's fields to be returned by the RPC call. diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobField/JobField.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobField/JobField.m new file mode 100644 index 0000000..678d630 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobField/JobField.m @@ -0,0 +1,90 @@ +classdef JobField < gcp.bigquery.Object +% JOBFIELD Fields of a BigQuery Job resource. +% +% Usage +% +% Returns a JobField array containing JobFields in the order they are declared +% +% 1. JobFields = gcp.bigquery.Bigquery.Jobfield.values(); % array of all fields +% 2. JobFields = gcp.bigquery.Bigquery.Jobfield.values('ID','STATUS'); % array of selected fields +% +% JobOption = gcp.bigquery.Bigquery.JobOption.fields(JobFields) +% +% Enum Constants for Field +% ------------------------ +% CONFIGURATION +% ETAG +% ID +% JOB_REFERENCE +% SELF_LINK +% STATISTICS +% STATUS +% USER_EMAIL + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = JobField(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class before Handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$JobField[]') + write(logObj,'error','JobField Object creation failed'); + else + obj.Handle = varargin{1}; + end + + end +end + +methods(Static) + % Returns an array containing the constants of this enum type, in the order they are declared. + function JobField = values() + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating JobFieldArray here. no input expected + JobFieldJ = javaMethod('values','com.google.cloud.bigquery.BigQuery$JobField'); + + % Wrapping into a MATLAB class object + JobField = gcp.bigquery.BigQuery.JobField(JobFieldJ); + end + + % Returns an array containing the constants of this enum type, in the order they are declared. + function JobField = valueOf(varargin) + % Imports + import com.google.cloud.bigquery.BigQuery; + + JobFieldArrJ = javaArray('com.google.cloud.bigquery.BigQuery$JobField',nargin); + for i = 1:nargin + Field = varargin{i}; + % Creating JobFieldArray here. no input expected + JobFieldJ = javaMethod('valueOf','com.google.cloud.bigquery.BigQuery$JobField',Field); + % Assign field to the array + JobFieldArrJ(i) = JobFieldJ; + end + + % Wrapping into a MATLAB class object + JobField = gcp.bigquery.BigQuery.JobField(JobFieldArrJ); + end + +end %methods(Static) + +end %class + +% Java API Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.JobField.html +% +% Supported Methods +% ------------------ +% static BigQuery.JobField valueOf(String name) +% Returns the enum constant of this type with the specified name. +% +% static BigQuery.JobField[] values() +% Returns an array containing the constants of this enum type, in the order they are declared. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobListOption/JobListOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobListOption/JobListOption.m new file mode 100644 index 0000000..9138d9d --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobListOption/JobListOption.m @@ -0,0 +1,116 @@ +classdef JobListOption < gcp.bigquery.Object +% JOBLISTOPTION Class for specifying job list options. +% +% Usage +% +% gbq = gcp.bigquery.Bigquery('credentials.json'); +% +% JobListOption = gcp.bigquery.BigQuery.JobListOption.pageSize(pageSize) +% +% JobListOption = gcp.bigquery.BigQuery.JobListOption.pageToken(pageToken) +% +% JobListOption = gcp.bigquery.BigQuery.JobListOption.parentJobId(parentJobId) +% +% jobLists = gbq.listJobs(JobListOption1,JobListOption2,...,...,JobListOptionN); + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = JobListOption(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of input object before handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$JobListOption') + write(logObj,'error','JobListOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + +%Returns an option to specify the maximum number of jobs returned per page. +function JobListOption = pageSize(pageSize) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating JobListOption. Expecting input to be of type long + JobListOptionJ = javaMethod('pageSize','com.google.cloud.bigquery.BigQuery$JobListOption',pageSize); + + % wrapping into a MATLAB class object + JobListOption = gcp.bigquery.BigQuery.JobListOption(JobListOptionJ); + +end + +%Returns an option to specify the page token from which to start listing jobs. +function JobListOption = pageToken(pageToken) + + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating JobListOption. Expecting input to be of type string + JobListOptionJ = javaMethod('pageToken','com.google.cloud.bigquery.BigQuery$JobListOption',pageToken); + + % wrapping into a MATLAB class object + JobListOption = gcp.bigquery.BigQuery.JobListOption(JobListOptionJ); + +end + +%Returns an option to list only child job from specify parent job id. +function JobListOption = parentJobId(parentJobId) + + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating JobListOption. Expecting input to be of type string + JobListOptionJ = javaMethod('parentJobId','com.google.cloud.bigquery.BigQuery$JobListOption',parentJobId); + + % wrapping into a MATLAB class object + JobListOption = gcp.bigquery.BigQuery.JobListOption(JobListOptionJ); + +end + + +end %methods(Static) + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.JobListOption.html +% +% Java API options +% ------------------- +% +% Supported Methods +% ------------------- +% static BigQuery.JobListOption pageSize(long pageSize) +% Returns an option to specify the maximum number of jobs returned per page. +% +% static BigQuery.JobListOption pageToken(String pageToken) +% Returns an option to specify the page token from which to start listing jobs. +% +% static BigQuery.JobListOption parentJobId(String parentJobId) +% Returns an option to list only child job from specify parent job id. +% +% Unsupported Methods +% ------------------- +% static BigQuery.JobListOption allUsers() +% Returns an option to list all jobs, even the ones issued by other users. +% +% static BigQuery.JobListOption fields(BigQuery.JobField... fields) +% Returns an option to specify the job's fields to be returned by the RPC call. +% +% static BigQuery.JobListOption maxCreationTime(long maxCreationTime) +% Returns an option to filter out jobs after the given maximum creation time. +% +% static BigQuery.JobListOption minCreationTime(long minCreationTime) +% Returns an option to filter out jobs before the given minimum creation time. +% +% static BigQuery.JobListOption stateFilter(JobStatus.State... stateFilters) +% Returns an option to list only jobs that match the provided state filters. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobOption/JobOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobOption/JobOption.m new file mode 100644 index 0000000..cc3d176 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@JobOption/JobOption.m @@ -0,0 +1,56 @@ +classdef JobOption < gcp.bigquery.Object +% JOBOPTION Class for specifying table get and create options. +% +% Usage +% +% fields = gcp.bigquery.BigQuery.JobField.values() +% JobOption = gcp.bigquery.Bigquery.JobOption.fields(fields) +% + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = JobOption(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for the Handle class + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$JobOption') + write(logObj,'error','JobOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end %methods + +methods(Static) + + % Returns an option to specify the job's fields to be returned by the RPC call. + function JobOption = fields(fields) + + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating DatasetOption. Required JobField object as input + JobOptionJ = javaMethod('fields','com.google.cloud.bigquery.BigQuery$JobOption', fields.Handle); + + % Wrapping into a MATLAB class object + JobOption = gcp.bigquery.BigQuery.JobOption(JobOptionJ); + + end + +end % methods(Static) + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.JobOption.html +% +% Java API options +%-------------------- +% static BigQuery.JobOption fields(BigQuery.JobField... fields) +% Returns an option to specify the job's fields to be returned by the RPC call. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryOption/QueryOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryOption/QueryOption.m new file mode 100644 index 0000000..d4b8722 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryOption/QueryOption.m @@ -0,0 +1,61 @@ +classdef QueryOption < gcp.bigquery.Object +% QUERYOPTION Summary of this class goes here +% +% Usage +% +% QueryResultsOption = gcp.bigquery.BigQuery.maxWaitTime(maxWaitTime) +% QueryResultsOption = gcp.bigquery.BigQuery.pageSize(pageSize) +% QueryOption = gcp.bigquery.BigQuery.of(QueryResultsOption) + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = QueryOption(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of the input object before assigning Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$QueryOption') + write(logObj,'error','QueryOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + + % Returns an option that sets how long to wait for the query to complete, in milliseconds, before returning. + function QueryOption = of(resultsOption) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating QueryOption. resultsOption is expected to be of + % the type gcp.bigquery.BigQuery.QueryResultsOption + QueryOptionJ = javaMethod('of','com.google.cloud.bigquery.BigQuery$QueryOption',resultsOption.Handle); + + % wrapping into a MATLAB class object + QueryOption = gcp.bigquery.BigQuery.QueryOption(QueryOptionJ); + end +end %methods(Static) + +end %class + +% Reference:https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.QueryOption.html +% +% Java API options +% ----------------- +% +% Method supported: +% ---------------- +% static BigQuery.QueryOption of(BigQuery.QueryResultsOption resultsOption) +% +% Method unsupported +% ------------------ +% static BigQuery.QueryOption of(com.google.cloud.RetryOption waitOption) \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryResultsOption/QueryResultsOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryResultsOption/QueryResultsOption.m new file mode 100644 index 0000000..fd9852e --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@QueryResultsOption/QueryResultsOption.m @@ -0,0 +1,107 @@ +classdef QueryResultsOption < gcp.bigquery.Object +% QUERYRESULTSOPTION Class for specifying query results options. +% Returns an option for the query results to be returned such as wait time, pagesize, row index to begin from etc +% +% Usage +% +% QueryResultsOption = gcp.bigquery.BigQuery.maxWaitTime(maxWaitTime) +% QueryResultsOption = gcp.bigquery.BigQuery.pageSize(pageSize) +% QueryResultsOption = gcp.bigquery.BigQuery.startIndex(startIndex) +% QueryResultsOption = gcp.bigquery.BigQuery.pageToken(pageToken) +% +% QueryOption = gcp.bigquery.BigQuery.of(QueryResultsOption) + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = QueryResultsOption(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class before assigning Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$QueryResultsOption') + write(logObj,'error','QueryResultsOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + + end +end + +methods(Static) + + % Returns an option that sets how long to wait for the query to complete, in milliseconds, before returning. + function QueryResultsOption = maxWaitTime(maxWaitTime) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating QueryResultsOption. pageToken is expected to be of the type string + QueryResultsOptionJ = javaMethod('maxWaitTime','com.google.cloud.bigquery.BigQuery$QueryResultsOption',maxWaitTime); + + % wrapping into a MATLAB class object + QueryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption(QueryResultsOptionJ); + end + + % Returns an option to specify the maximum number of rows returned per page. + function QueryResultsOption = pageSize(pageSize) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating QueryResultsOption. pageSize is expected to be of the type string + QueryResultsOptionJ = javaMethod('pageSize','com.google.cloud.bigquery.BigQuery$QueryResultsOption',pageSize); + + % wrapping into a MATLAB class object + QueryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption(QueryResultsOptionJ); + end + + % Returns an option to specify the page token from which to start getting query results. + function QueryResultsOption = pageToken(pageToken) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating QueryResultsOption. pageToken is expected to be of the type string + QueryResultsOptionJ = javaMethod('pageToken','com.google.cloud.bigquery.BigQuery$QueryResultsOption',pageToken); + + % wrapping into a MATLAB class object + QueryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption(QueryResultsOptionJ); + end + + % Returns an option that sets the zero-based index of the row from which to start getting query results. + function QueryResultsOption = startIndex(startIndex) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Creating QueryResultsOption.startIndex is expected to be of the + % type long + QueryResultsOptionJ = javaMethod('startIndex','com.google.cloud.bigquery.BigQuery$QueryResultsOption',startIndex); + + % wrapping into a MATLAB class object + QueryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption(QueryResultsOptionJ); + end + +end + + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.QueryResultsOption.html +% +% Java API options +%-------------------- +% static BigQuery.QueryResultsOption maxWaitTime(long maxWaitTime) +% Returns an option that sets how long to wait for the query to complete, in milliseconds, before returning. +% +% static BigQuery.QueryResultsOption pageSize(long pageSize) +% Returns an option to specify the maximum number of rows returned per page. +% +% static BigQuery.QueryResultsOption pageToken(String pageToken) +% Returns an option to specify the page token from which to start getting query results. +% +% static BigQuery.QueryResultsOption startIndex(long startIndex) +% Returns an option that sets the zero-based index of the row from which to start getting query results. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableField/TableField.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableField/TableField.m new file mode 100644 index 0000000..69228d7 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableField/TableField.m @@ -0,0 +1,104 @@ +classdef TableField < gcp.bigquery.Object +% TABLEFIELD Fields of a BigQuery Table resource. +% +% Usage +% +% % Creating Table fields +% 1. fields = gcp.bigquery.BigQuery.TableField.values() % returns all Table fields +% Note: Use only if you have permissions for all tables within this project + +% 2. fields = gcp.bigquery.BigQuery.TableField.valueOf('ID','LOCATION') % returns selected Table fields +% +% tableOption = gcp.bigquery.BigQuery.TableOption.fields(fields); % options for specifying table get, create and update options. +% +% +% Enum Constants for Table fields +% ------------------------------- +% CREATION_TIME +% DESCRIPTION +% ETAG +% EXPIRATION_TIME +% EXTERNAL_DATA_CONFIGURATION +% FRIENDLY_NAME +% ID +% LABELS +% LAST_MODIFIED_TIME +% LOCATION +% NUM_BYTES +% NUM_ROWS +% SCHEMA +% SELF_LINK +% STREAMING_BUFFER +% TABLE_REFERENCE +% TIME_PARTITIONING +% TYPE +% VIEW + + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = TableField(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking class before Handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$TableField[]') + write(logObj,'error','TableField Object creation failed'); + else + % Assigning array of Tale fields to Handle + obj.Handle = varargin{1}; + end + + end +end + +methods(Static) + % Returns an array containing all the enums + function TableField = values() + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating TableFieldArray here. no input expected + TableFieldJ = javaMethod('values','com.google.cloud.bigquery.BigQuery$TableField'); + + % Wrapping into a MATLAB class object + TableField = gcp.bigquery.BigQuery.TableField(TableFieldJ); + end + + % Returns an array containing the constants of this enum type, in the order they are declared. + function TableField = valueOf(varargin) + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating TableFieldArray + TableFieldArrJ = javaArray('com.google.cloud.bigquery.BigQuery$TableField',nargin); + + for i = 1:nargin + TableFieldJ = javaMethod('valueOf','com.google.cloud.bigquery.BigQuery$TableField',varargin{i}); + TableFieldArrJ(i) = TableFieldJ; + end + + % Wrapping into a MATLAB class object + TableField = gcp.bigquery.BigQuery.TableField(TableFieldArrJ); + end + +end %methods(Static) + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.TableField.html +% +% Java API options +% ----------------- +% static BigQuery.TableField valueOf(String name) +% Returns the enum constant of this type with the specified name. +% +% static BigQuery.TableField[] values() +% Returns an array containing the constants of this enum type, in the order they are declared. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableListOption/TableListOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableListOption/TableListOption.m new file mode 100644 index 0000000..44b512e --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableListOption/TableListOption.m @@ -0,0 +1,56 @@ +classdef TableListOption < gcp.bigquery.Object +% TABLELISTOPTION Class for specifying table list options. +% +% Usage (Implicitly used by method listTables in gcp.bigquery.Bigquery +% +% gbq = gcp.bigquery.BigQuery("credentials.json"); +% tableListOption = gcp.bigquery.Bigquery.TableListOption.pageSize(pageSize) +% tableList = gbq.listTables('datsetId'); + + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = TableListOption(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking class before handle assignement + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$TableListOption') + write(logObj,'error','TableListOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + +end + +methods(Static) + + % pagesize method is used for configuring number of tables you would like list in a page + % when receiving response + function tableListOption = pageSize(pageSize) + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Input pageSize is of type long - MATLAB double + tableListOptionJ = javaMethod('pageSize','com.google.cloud.bigquery.BigQuery$TableListOption',pageSize); + + % Wrapping into a MATLAB class object + tableListOption = gcp.bigquery.BigQuery.TableListOption(tableListOptionJ); + end +end + +end %class +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.TableListOption.html +% +% Java API options +%-------------------- +% static BigQuery.TableListOption pageSize(long pageSize) +% Returns an option to specify the maximum number of tables returned per page. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableOption/TableOption.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableOption/TableOption.m new file mode 100644 index 0000000..635cbed --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQuery/@TableOption/TableOption.m @@ -0,0 +1,56 @@ +classdef TableOption < gcp.bigquery.Object +% TABLEOPTION Specifies options for querying Table fields +% +% +% Usage +% +% fields = gcp.bigquery.BigQuery.TableField.valueOf('ID','LOCATION') % returns all Table fields +% TableOption = gcp.bigquery.BigQuery.TableOption.fields(fields) + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = TableOption(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking class before Handle assignment + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQuery$TableOption') + write(logObj,'error','TableOption Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + + % Returns an option to specify the table's fields to be returned by the RPC call. + function TableOption = fields(fields) + + % Imports + import com.google.cloud.bigquery.BigQuery; + + % Creating TableOption. Required TableField object as input + TableOptionJ = javaMethod('fields','com.google.cloud.bigquery.BigQuery$TableOption', fields.Handle); + + % Wrapping into a MATLAB class object + TableOption = gcp.bigquery.BigQuery.TableOption(TableOptionJ); + + end + +end % methods(Static) + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/BigQuery.TableOption.html +% +% Java API options +%-------------------- +% static BigQuery.TableOption fields(BigQuery.TableField... fields) +% Returns an option to specify the table's fields to be returned by the RPC call. diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+BigQueryOptions/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQueryOptions/@Builder/Builder.m new file mode 100644 index 0000000..3000a0f --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+BigQueryOptions/@Builder/Builder.m @@ -0,0 +1,73 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for BigQueryOptions +% +% BigQueryOptions.Builder is used to set configuration for BigQuery client object. +% +% +% bigqueryOptionsBuilder = gcp.bigquery.BigQueryOptions.Builder() + +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQueryOptions$Builder') + write(logObj,'error','BigQueryOptions.Builder Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + function BigQueryOptionsBuilder = setLocation(obj,location) + % set location for the BigQueryOptions builder object for + % creating BigQuery client + BigQueryOptionsBuilder = obj.Handle; + BigQueryOptionsBuilder = BigQueryOptionsBuilder.setLocation(location); + BigQueryOptionsBuilder = gcp.bigquery.BigQueryOptions.Builder(BigQueryOptionsBuilder); + end + + function BigQueryOptionsBuilder = setCredentials(obj,credentials) + % set credentials for gcp client for the BigQueryOptions builder object for + % creating BigQuery client + BigQueryOptionsBuilder = obj.Handle; + BigQueryOptionsBuilder = BigQueryOptionsBuilder.setCredentials(credentials); + BigQueryOptionsBuilder = gcp.bigquery.BigQueryOptions.Builder(BigQueryOptionsBuilder); + end + + function BigQueryOptionsBuilder = setProjectId(obj,projectId) + % set projectId of the Google Cloud project for the BigQueryOptions builder object for + % creating BigQuery client + BigQueryOptionsBuilder = obj.Handle; + BigQueryOptionsBuilder = BigQueryOptionsBuilder.setProjectId(projectId); + BigQueryOptionsBuilder = gcp.bigquery.BigQueryOptions.Builder(BigQueryOptionsBuilder); + end + function bigQueryOptions = build(obj) + % returns BigQueryOptions using the build method of class + % BigQueryOptions.Builder + bigQueryOptionsBuilder= obj.Handle; + bigQueryOptions= bigQueryOptionsBuilder.build; + bigQueryOptions = gcp.bigquery.BigQueryOptions(bigQueryOptions); + end + end +end + +%% Reference : https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/BigQueryOptions.Builder.html +% +% Supported Methods +% ----------------- +% +% BigQueryOptions build() +% +% BigQueryOptions.Builder setLocation(String location) +% +% BigQueryOptions.Builder setCredentials(GoogleCredentials credentials) +% +% BigQueryOptions.Builder setProjectId(String ProjectId) \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+DatasetInfo/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+DatasetInfo/@Builder/Builder.m new file mode 100644 index 0000000..daaeac7 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+DatasetInfo/@Builder/Builder.m @@ -0,0 +1,96 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for DatasetInfo objects. +% +% DatasetInfo.Builder is used to set configuration for the DatasetInfo object. +% +% datasetInfoBuilder = gcp.bigquery.DatasetInfo.newBuilder(projectId,datasetId); +% datasetInfoBuilder = datasetInfoBuilder.setLocation("location"); +% datasetInfoBuilder = datasetInfoBuilder.setLocation(datasetId); +% datasetInfo = datasetInfoBuilder.build(); +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validate builder object class before assigning the Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.DatasetInfo$Builder') + % Unexpected class of the input object + write(logObj,'error','DatasetInfo.Builder object creation failed'); + else + % Object class is as expected. Object assigned to the + % Handle of MATLAB class object DatasetInfo.Builder + obj.Handle = varargin{1}; + end + end + % sets location for datasetInfo + function datasetInfoBuilder = setLocation(obj,location) + + % access datasetInfoBuilder object Handle + datasetInfoBuilderJ = obj.Handle; + + % set location as a part of the builder for creating + % datasetInfo object + datasetInfoBuilderJ = datasetInfoBuilderJ.setLocation(location); + + % wrapping the Java class object datasetInfoBuilderJ to MATLAB + % class object datasetInfoBuilder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + end + + % sets datasetId for datasetInfo + function datasetInfoBuilder = setDatasetId(obj,datasetId) + + % access datasetInfoBuilder object Handle + datasetInfoBuilderJ = obj.Handle; + + % verifying class for datasetId object + if isa(datasetId,'gcp.bigquery.DatasetId') + + % set datasetId as a part of the builder for creating + % datasetInfo + datasetInfoBuilderJ = datasetInfoBuilderJ.setDatasetId(datasetId.Handle); + + % wrapping the Java class object datasetInfoBuilderJ to MATLAB + % class object datasetInfoBuilder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + + else + warning("Expected input argument to be of class 'gcp.bigquery.DatasetId'."); + end + end + + % Building datasetInfo.Builder to return datasetInfo object + function datasetInfo = build(obj) + % returns datasetInfo using the build method of class + % datasetInfo.Builder + datasetInfoBuilderJ = obj.Handle; + datasetInfoJ = datasetInfoBuilderJ.build; + + % wrapping the Java class object datasetInfoBuilderJ to MATLAB + % class object datasetInfoBuilder + datasetInfo = gcp.bigquery.DatasetInfo(datasetInfoJ); + end + end +end + +%% Reference : https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/DatasetInfo.Builder.html +% +% Supported Methods +% ----------------- +% +% abstract DatasetInfo build() +% Creates a DatasetInfo object. +% +% abstract DatasetInfo.Builder setLocation(String location) +% Sets the geographic location where the dataset should reside. +% +% abstract DatasetInfo.Builder setDatasetId(DatasetId datasetId) +% Sets the dataset identity. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+JobId/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+JobId/@Builder/Builder.m new file mode 100644 index 0000000..faef7ed --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+JobId/@Builder/Builder.m @@ -0,0 +1,86 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for JobId objects. +% +% JobId.Builder is used to set configuration and jobId. +% +% Usage (implicitly used by +gcp/+bigquery/@JobId) +% +% jobIdBuilder = gcp.bigquery.JobId.newBuilder() +% jobIdBuilder = jobIdBuilder.setLocation('US'); +% jobId = jobIdBuilder.build() +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(varargin{1},'com.google.cloud.bigquery.JobId$Builder') + write(logObj,'error','JobId.Builder Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + function jobIdBuilder = setJob(obj,jobId) + % set jobId as a part of the builder for creating jobId + % jobId is of type "string" + jobIdBuilder = obj.Handle; + jobIdBuilder = jobIdBuilder.setJob(jobId); + jobIdBuilder = gcp.bigquery.JobId.Builder(jobIdBuilder); + end + + function jobIdBuilder = setLocation(obj,location) + % set location as a part of the builder for creating job + % location is of type "string" + jobIdBuilder = obj.Handle; + jobIdBuilder = jobIdBuilder.setLocation(location); + jobIdBuilder = gcp.bigquery.JobId.Builder(jobIdBuilder); + end + + function jobIdBuilder = setProject(obj,projectid) + % set project as a part of the builder for creating job + % projectid is of type "string" + jobIdBuilder = obj.Handle; + jobIdBuilder = jobIdBuilder.setLocation(projectid); + jobIdBuilder = gcp.bigquery.JobId.Builder(jobIdBuilder); + end + + function jobIdBuilder = setRandomJob(obj) + % setJob to a pseudo-random string. + jobIdBuilder = obj.Handle; + jobIdBuilder = jobIdBuilder.setRandomJob(); + jobIdBuilder = gcp.bigquery.JobId.Builder(jobIdBuilder); + end + + function jobId = build(obj) + % returns jobId using the build method of class + % jobId.Builder + jobIdBuilder = obj.Handle; + jobId = jobIdBuilder.build; + jobId = gcp.bigquery.JobId(jobId); + end + end +end + +%% Reference : https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/JobId.Builder.html +% +% Supported Methods +% ----------------- +% +% abstract JobId build() +% +% abstract JobId.Builder setJob(String job) +% +% abstract JobId.Builder setLocation(String location) +% +% abstract JobId.Builder setProject(String project) +% +% JobId.Builder setRandomJob() +% setJob to a pseudo-random string. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@Builder/Builder.m new file mode 100644 index 0000000..bec1aa0 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@Builder/Builder.m @@ -0,0 +1,63 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for JobInfo objects. +% +% JobInfo.Builder is used to set configuration and jobId for the JobInfo object. +% +% Usage (implicitly used by +gcp/+bigquery/@JobInfo) +% +% jobInfoBuilder = gcp.bigquery.JobInfo.newBuilder(QueryJobConfiguration) +% jobInfoBuilder = jobInfoBuilder.setJobId(jobId); +% jobInfo = jobInfoBuilder.build(); +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify class of the input object before assigning the Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.JobInfo$Builder') + write(logObj,'error','JobInfo.Builder Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + function jobInfoBuilder = setJobId(obj,jobId) + % set jobId as a part of the builder for creating jobInfo + jobInfoBuilder = obj.Handle; + jobInfoBuilder = jobInfoBuilder.setJobId(jobId.Handle); + jobInfoBuilder = gcp.bigquery.JobInfo.Builder(jobInfoBuilder); + end + + function jobInfo = build(obj) + % returns jobInfo using the build method of class + % jobInfo.Builder + jobInfoBuilder = obj.Handle; + jobInfo = jobInfoBuilder.build; + jobInfo = gcp.bigquery.JobInfo(jobInfo); + end + end +end + +%% Reference : https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobInfo.Builder.html +% +% Supported Methods +% ----------------- +% +% abstract JobInfo build() +% Creates a JobInfo object. +% +% abstract JobInfo.Builder setJobId(JobId jobId) +% Sets the job identity. +% +% Unsupported Methods: +% ------------------- +% abstract JobInfo.Builder setConfiguration(JobConfiguration configuration) +% Sets a configuration for the JobInfo object. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@CreateDisposition/CreateDisposition.m b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@CreateDisposition/CreateDisposition.m new file mode 100644 index 0000000..6460572 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@CreateDisposition/CreateDisposition.m @@ -0,0 +1,66 @@ +classdef CreateDisposition < gcp.bigquery.Object +% CREATEDISPOSITION Specifies whether the job is allowed to create new tables. +% +% Usage: +% +% % Set createDisposition for a table in order to allow creation of new +% % table if needed +% +% createDispositionEnum = 'CREATE_IF_NEEDED'; +% createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createDispositionEnum); +% loadJobConfigurationBuilder = loadJobConfigurationBuilder.setCreateDisposition(createDispositionConfig); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setCreateDisposition(createDispositionConfig); +% +% Enum Constant and Description +% ----------------------------- +% * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. +% +% * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = CreateDisposition(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class of returned object before Handle + % assignement + if ~ isa(varargin{1},'com.google.cloud.bigquery.JobInfo$CreateDisposition') + write(logObj,'error','JobInfo.CreateDisposition Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + end + + methods (Static) + + % Returns the enum constant of this type with the specified name. + function createDisposition = valueOf(name) + CreateDispositionJ = javaMethod('valueOf','com.google.cloud.bigquery.JobInfo$CreateDisposition',name); + createDisposition = gcp.bigquery.JobInfo.CreateDisposition(CreateDispositionJ); + end + + end +end + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobInfo.CreateDisposition.html +% +% Java API supported +% ------------------- +% static JobInfo.CreateDisposition valueOf(String name) +% Returns the enum constant of this type with the specified name. +% + +% Unsupported API +% ---------------- +% static JobInfo.CreateDisposition[] values() +% Returns an array containing the constants of this enum type, in the order they are declared. + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@WriteDisposition/WriteDisposition.m b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@WriteDisposition/WriteDisposition.m new file mode 100644 index 0000000..23ca677 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+JobInfo/@WriteDisposition/WriteDisposition.m @@ -0,0 +1,64 @@ +classdef WriteDisposition < gcp.bigquery.Object +% WRITEDISPOSITION Specifies whether the job is allowed to create new tables. +% +% Usage: +% +% % Set writeDisposition for a table in order to allow appending with new data +% +% writeDispositionEnum = 'WRITE_APPEND'; +% writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); +% loadJobConfigurationBuilder = loadJobConfigurationBuilder.setWriteDisposition(writeDispositionConfig); +% +% Enum Constant and Description +% ----------------------------- +% * WRITE_APPEND : Configures the job to append data to the table if it already exists. +% +% * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. +% +% * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. + +% (c) 2020 MathWorks, Inc. + + properties + + end + + methods + function obj = WriteDisposition(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class of returned object before Handle + % assignement + if ~ isa(varargin{1},'com.google.cloud.bigquery.JobInfo$WriteDisposition') + write(logObj,'error','JobInfo.WriteDisposition Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + end + + methods (Static) + + % Returns the enum constant of this type with the specified name. + function writeDisposition = valueOf(name) + writeDispositionJ = javaMethod('valueOf','com.google.cloud.bigquery.JobInfo$WriteDisposition',name); + writeDisposition = gcp.bigquery.JobInfo.WriteDisposition(writeDispositionJ); + end + + end +end + +%% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobInfo.WriteDisposition.html +% +% Java API supported +% ------------------- +% static JobInfo.WriteDisposition valueOf(String name) +% Returns the enum constant of this type with the specified name. +% +% Unsupported API +% --------------- +% static JobInfo.WriteDisposition[] values() +% Returns an array containing the constants of this enum type, in the order they are declared. diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+LoadJobConfiguration/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+LoadJobConfiguration/@Builder/Builder.m new file mode 100644 index 0000000..1aada75 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+LoadJobConfiguration/@Builder/Builder.m @@ -0,0 +1,140 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for LoadJobConfiguration objects. +% +% LoadJobConfiguration.Builder is used to set configuration for writing data +% to BigQuery Tables from external sources such as Google Cloud Storage +% +% Usage (implicitly used by +gcp/+bigquery/@LoadJobConfiguration) +% +% LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,sourceUri,formatOptions); +% LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); +% LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setCreateDisposition('CREATE_IF_NEEDED'); +% LoadJobConfiguration = LoadJobConfigurationBuilder.build; +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class of returned object before Handle + % assignement + if ~ isa(varargin{1},'com.google.cloud.bigquery.LoadJobConfiguration$Builder') + write(logObj,'error','LoadJobConfiguration.Builder object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + % Creates a LoadJobConfiguration object + function LoadJobConfiguration = build(obj) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationJ = LoadJobConfigurationBuilderJ.build; + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration(LoadJobConfigurationJ); + end + + % Sets automatic inference of the options and schema for CSV and JSON sources. + function LoadJobConfigurationBuilder = setAutodetect(obj,autodetect) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationBuilderJ = LoadJobConfigurationBuilderJ.setAutodetect(autodetect); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + end + + + % Sets the tableId for the destination table. + function LoadJobConfigurationBuilder = setDestinationTable(obj,tableId) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationBuilderJ = LoadJobConfigurationBuilderJ.setDestinationTable(tableId.Handle); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + end + + % Sets the source format, and possibly some parsing options, of the external data. + function LoadJobConfigurationBuilder = setFormatOptions(obj,FormatOptions) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationBuilderJ = LoadJobConfigurationBuilderJ.setFormatOptions(FormatOptions.Handle); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + end + + % Sets whether the job is allowed to create new tables. + function LoadJobConfigurationBuilder = setCreateDisposition(obj,CreateDisposition) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationBuilderJ = LoadJobConfigurationBuilderJ.setCreateDisposition(CreateDisposition.Handle); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + end + + % Sets the action that should occur if the destination table already exists + function LoadJobConfigurationBuilder = setWriteDisposition(obj,WriteDisposition) + LoadJobConfigurationBuilderJ = obj.Handle; + LoadJobConfigurationBuilderJ = LoadJobConfigurationBuilderJ.setWriteDisposition(WriteDisposition.Handle); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + end + end +end + +%% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/LoadJobConfiguration.Builder.html +% +% Supported Java APIs +% -------------------- +% LoadJobConfiguration build() +% Creates an object. +% +% LoadJobConfiguration.Builder setAutodetect(Boolean autodetect) +% [Experimental] Sets automatic inference of the options and schema for CSV and JSON sources. +% +% LoadJobConfiguration.Builder setCreateDisposition(JobInfo.CreateDisposition createDisposition) +% Sets whether the job is allowed to create new tables. +% +% LoadJobConfiguration.Builder setDestinationTable(TableId destinationTable) +% Sets the destination table to load the data into. +% +% LoadJobConfiguration.Builder setFormatOptions(FormatOptions formatOptions) +% Sets the source format, and possibly some parsing options, of the external data. +% +% LoadJobConfiguration.Builder setWriteDisposition(JobInfo.WriteDisposition writeDisposition) +% Sets the action that should occur if the destination table already exists. +% +%% Unsupported methods +% ------------------- +% LoadJobConfiguration.Builder setClustering(Clustering clustering) +% Sets the clustering specification for the destination table. +% +% LoadJobConfiguration.Builder setSchemaUpdateOptions(List schemaUpdateOptions) +% [Experimental] Sets options allowing the schema of the destination table to be updated as a side effect of the load job. +% +% LoadJobConfiguration.Builder setSourceUris(List sourceUris) +% Sets the fully-qualified URIs that point to source data in Google Cloud Storage +% +% LoadJobConfiguration.Builder setTimePartitioning(TimePartitioning timePartitioning) +% Sets the time partitioning specification for the destination table. +% +% LoadJobConfiguration.Builder setUseAvroLogicalTypes(Boolean useAvroLogicalTypes) +% If FormatOptions is set to AVRO, you can interpret logical types into their corresponding types (such as TIMESTAMP) instead of only using their raw types (such as INTEGER). +% +% LoadJobConfiguration.Builder setJobTimeoutMs(Long jobTimeoutMs) +% [Optional] Job timeout in milliseconds. +% +% LoadJobConfiguration.Builder setLabels(Map labels) +% The labels associated with this job. +% +% LoadJobConfiguration.Builder setMaxBadRecords(Integer maxBadRecords) +% Sets the maximum number of bad records that BigQuery can ignore when running the job. +% +% LoadJobConfiguration.Builder setNullMarker(String nullMarker) +% Sets the string that represents a null value in a CSV file. +% +% LoadJobConfiguration.Builder setRangePartitioning(RangePartitioning rangePartitioning) +% Range partitioning specification for this table. +% +% LoadJobConfiguration.Builder setDestinationEncryptionConfiguration(EncryptionConfiguration encryptionConfiguration) +% +% LoadJobConfiguration.Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) +% Sets whether BigQuery should allow extra values that are not represented in the table schema. +% +% LoadJobConfiguration.Builder setSchema(Schema schema) +% Sets the schema for the destination table. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+QueryJobConfiguration/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+QueryJobConfiguration/@Builder/Builder.m new file mode 100644 index 0000000..4e596a3 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+QueryJobConfiguration/@Builder/Builder.m @@ -0,0 +1,122 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for JobConfiguration objects. +% +% QueryJobconfiguration.Builder is used to set query configuration such +% as defaultdataset, destinationtable, querytype, size of queryresults, create disposition and writedisposition. +% +% Usage +% +% QueryJobConfigurationBuilder = newBuilder(query); +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setAllowLargeResults([TRUE/FALSE]) +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setUseLegacySql([TRUE/FALSE]) +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setQuery(query) +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setDestinationTable(tableId) +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setDefaultDatset(datasetid); +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setCreateDisposition(createdisposition); +% (optional) QueryJobConfigurationBuilder = QueryJobConfigurationBuilder.setWriteDisposiion(writedisposition); +% QueryJobConfiguration = QueryJobConfigurationBuilder.build; +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Checking for class of returned object before Handle + % assignement + if ~ isa(varargin{1},'com.google.cloud.bigquery.QueryJobConfiguration$Builder') + write(logObj,'error','QueryJobConfiguration.Builder object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + + function queryJobConfiguration = build(obj) + %METHOD1 Summary of this method goes here + % Detailed explanation goes here + queryJobConfigurationBuilder = obj.Handle; + queryJobConfigurationJ = queryJobConfigurationBuilder.build; + queryJobConfiguration = gcp.bigquery.QueryJobConfiguration(queryJobConfigurationJ); + end + + % QueryJobConfiguration.Builder setAllowLargeResults(Boolean allowLargeResults) + % Sets whether the job is enabled to create arbitrarily large results. + function queryJobConfigurationBuilder = setAllowLargeResults(obj,allowLargeResults) + %METHOD1 Summary of this method goes here + % Detailed explanation goes here + queryJobConfigurationBuilderJ = obj.Handle; + allowLargeResults = javaObject('java.lang.Boolean',allowLargeResults); + queryJobConfigurationBuilderJ = queryJobConfigurationBuilderJ.setAllowLargeResults(allowLargeResults); + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(queryJobConfigurationBuilderJ); + end + + % QueryJobConfiguration.Builder setQuery(String query) + % Sets the BigQuery SQL query to execute. + function queryJobConfigurationBuilder =setQuery(obj, query) + %METHOD1 Summary of this method goes here + % Detailed explanation goes here + queryJobConfigurationBuilderJ = obj.Handle; + queryJobConfigurationBuilderJ = queryJobConfigurationBuilderJ.setQuery(query); + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(queryJobConfigurationBuilderJ); + end + +% QueryJobConfiguration.Builder setUseLegacySql(Boolean useLegacySql) +% Sets whether to use BigQuery's legacy SQL dialect for this query. + function queryJobConfigurationBuilder = setUseLegacySql(obj,useLegacySql) + %METHOD1 Summary of this method goes here + % Detailed explanation goes here + queryJobConfigurationBuilderJ = obj.Handle; + useLegacySql = javaObject('java.lang.Boolean',useLegacySql); + queryJobConfigurationBuilderJ = queryJobConfigurationBuilderJ.setUseLegacySql(useLegacySql); + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(queryJobConfigurationBuilderJ); + end + + % sets destination table + function queryJobConfigurationBuilder = setDestinationTable(obj,tableId) + %METHOD1 Summary of this method goes here + % Detailed explanation goes here + queryJobConfigurationBuilderJ = obj.Handle; + queryJobConfigurationBuilderJ = queryJobConfigurationBuilderJ.setDestinationTable(tableId.Handle); + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(queryJobConfigurationBuilderJ); + end + +% QueryJobConfiguration.Builder setDefaultDataset(String defaultDataset) +% Sets the default dataset. + function QueryJobConfigurationBuilder = setDefaultDataset(obj,defaultDataset) + QueryJobConfigurationBuilderJ = obj.Handle; + if isa(defaultDataset,'string') + QueryJobConfigurationBuilderJ = QueryJobConfigurationBuilderJ.setDefaultDataset(defaultDataset); + elseif isa(defaultDataset,'gcp.bigquery.DatasetId') + QueryJobConfigurationBuilderJ = QueryJobConfigurationBuilderJ.setDefaultDataset(defaultDataset.Handle); + else + warning('Incorrect class for DatasetId. It should be either string or gcp.bigquery.DatasetId'); + end + QueryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(QueryJobConfigurationBuilderJ); + end + + % setWriteDisposition(JobInfo.WriteDisposition writeDisposition) + % Sets the action that should occur if the destination table already exists + function QueryJobConfigurationBuilder = setWriteDisposition(obj,WriteDisposition) + QueryJobConfigurationBuilderJ = obj.Handle; + QueryJobConfigurationBuilderJ = QueryJobConfigurationBuilderJ.setWriteDisposition(WriteDisposition.Handle); + QueryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(QueryJobConfigurationBuilderJ); + end + +% QueryJobConfiguration.Builder setCreateDisposition(JobInfo.CreateDisposition createDisposition) +% Sets whether the job is allowed to create tables. + % Sets whether the job is allowed to create new tables. + function QueryJobConfigurationBuilder = setCreateDisposition(obj,CreateDisposition) + QueryJobConfigurationBuilderJ = obj.Handle; + QueryJobConfigurationBuilderJ = QueryJobConfigurationBuilderJ.setCreateDisposition(CreateDisposition.Handle); + QueryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(QueryJobConfigurationBuilderJ); + end + end +end + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+StandardTableDefinition/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+StandardTableDefinition/@Builder/Builder.m new file mode 100644 index 0000000..50deec9 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+StandardTableDefinition/@Builder/Builder.m @@ -0,0 +1,59 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for StandardTableDefinition objects. +% +% StandardTableDefinition.Builder is used to set configuration for +% writing data to BigQuery Tables +% +% +% Usage (implicitly used by +gcp/+bigquery/@StandardTableDefinition) +% +% StandardTableDefinitionBuilder = gcp.bigquery.BigQuery.newBuilder(); +% StandardTableDefinition = StandardTableDefinitionBuilder.build; +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify class of the input java class object before + % wrapping/assigning it as a Handle for MATLAB class object + % gcp.bigquery.StandardTableDefinition.Builder + if ~ isa(varargin{1},'com.google.cloud.bigquery.StandardTableDefinition$Builder') + write(logObj,'error','StandardTableDefinition.Builder Object creation failed'); + else + % Assigning Handle + obj.Handle = varargin{1}; + end + end + + % Creates an StandardTableDefinition object by calling build() on the builder + % object + function StandardTableDefinition = build(obj) + % Accessing builder using the class handle + StandardTableDefinitionBuilderJ = obj.Handle; + % Building Table Definition + StandardTableDefinitionJ = StandardTableDefinitionBuilderJ.build; + + % Wrapping Java object StandardTableDefinitionJ to MATLAB class + % object StandardTableDefinition using constructor + StandardTableDefinition = gcp.bigquery.StandardTableDefinition(StandardTableDefinitionJ); + end + + end % methods +end % class + +% Java Reference API : https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/StandardTableDefinition.Builder.html +% ------------------- +% +% Supported Methods: +% ------------------ +% abstract StandardTableDefinition build() +% Creates an StandardTTableDefinition object. + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/+WriteChannelConfiguration/@Builder/Builder.m b/Software/MATLAB/app/system/+gcp/+bigquery/+WriteChannelConfiguration/@Builder/Builder.m new file mode 100644 index 0000000..1708bf6 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/+WriteChannelConfiguration/@Builder/Builder.m @@ -0,0 +1,142 @@ +classdef Builder < gcp.bigquery.Object +%BUILDER A builder for WriteChannelConfiguration objects. +% +% WriteChannelConfiguration.Builder is used to set configuration for +% writing data to BigQuery Tables +% +% +% Usage (implicitly used by +gcp/+bigquery/@WriteChannelConfiguration) +% +% WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.newBuilder(TableId); +% WriteChannelConfigurationBuilder = WriteChannelConfigurationBuilder.setAutodetect(true); +% WriteChannelConfigurationBuilder = WriteChannelConfigurationBuilder.setWriteDisposition('WRITE_APPEND'); +% WriteChannelConfiguration = WriteChannelConfigurationBuilder.build; +% + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + + function obj = Builder(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify class of input object before assigning to the Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.WriteChannelConfiguration$Builder') + write(logObj,'error','WriteChannelConfiguration.Builder Object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + % Build the Builder configuration for writer + function WriteChannelConfiguration = build(obj) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationJ = WriteChannelConfigurationBuilderJ.build; + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfiguration = gcp.bigquery.WriteChannelConfiguration(WriteChannelConfigurationJ); + end + + % Sets automatic inference of the options and schema for CSV and JSON sources + function WriteChannelConfigurationBuilder = setAutodetect(obj,autodetect) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationBuilderJ = WriteChannelConfigurationBuilderJ.setAutodetect(autodetect); + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + end + + % Sets the destination table to load the data into. + function WriteChannelConfigurationBuilder = setDestinationTable(obj,TableId) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationBuilderJ = WriteChannelConfigurationBuilderJ.setDestinationTable(TableId.Handle); + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + end + + % Sets the source format, and possibly some parsing options, of the external data. + function WriteChannelConfigurationBuilder = setFormatOptions(obj,FormatOptions) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationBuilderJ = WriteChannelConfigurationBuilderJ.setFormatOptions(FormatOptions.Handle); + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + end + + % Sets the action that should occur if the destination table already exists. + function WriteChannelConfigurationBuilder = setWriteDisposition(obj,writeDisposition) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationBuilderJ = WriteChannelConfigurationBuilderJ.setWriteDisposition(writeDisposition.Handle); + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + end + + % Sets whether the job is allowed to create new tables. + function WriteChannelConfigurationBuilder = setCreateDisposition(obj,createDisposition) + WriteChannelConfigurationBuilderJ = obj.Handle; + WriteChannelConfigurationBuilderJ = WriteChannelConfigurationBuilderJ.setCreateDisposition(createDisposition.Handle); + + % Wrap Java class object WriteChannelConfigurationJ into MATLAB class object WriteChannelConfiguration + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + end + end +end + +%% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/WriteChannelConfiguration.html +% +% Supported Methods: +% ------------------ +% +% WriteChannelConfiguration build() +% Returns built object +% +% WriteChannelConfiguration.Builder setAutodetect(Boolean autodetect) +% [Experimental] Sets automatic inference of the options and schema for CSV and JSON sources. +% +% WriteChannelConfiguration.Builder setCreateDisposition(JobInfo.CreateDisposition createDisposition) +% Sets whether the job is allowed to create new tables. +% +% WriteChannelConfiguration.Builder setDestinationTable(TableId destinationTable) +% Sets the destination table to load the data into. +% +% WriteChannelConfiguration.Builder setFormatOptions(FormatOptions formatOptions) +% Sets the source format, and possibly some parsing options, of the external data. +% +% WriteChannelConfiguration.Builder setWriteDisposition(JobInfo.WriteDisposition writeDisposition) +% Sets the action that should occur if the destination table already exists. +% +%% Unsupported Methods: +% -------------------- +% +% WriteChannelConfiguration.Builder setClustering(Clustering clustering) +% Sets the clustering specification for the destination table. +% +% WriteChannelConfiguration.Builder setSchemaUpdateOptions(List schemaUpdateOptions) +% [Experimental] Sets options allowing the schema of the destination table to be updated as a side effect of the load job. +% +% WriteChannelConfiguration.Builder setTimePartitioning(TimePartitioning timePartitioning) +% Sets the time partitioning specification for the destination table. +% +% WriteChannelConfiguration.Builder setUseAvroLogicalTypes(Boolean useAvroLogicalTypes) +% If FormatOptions is set to AVRO, you can interpret logical types into their corresponding types (such as TIMESTAMP) instead of only using their raw types (such as INTEGER). +% +% LoadConfiguration.Builder setDestinationEncryptionConfiguration(EncryptionConfiguration encryptionConfiguration) +% +% WriteChannelConfiguration.Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) +% Sets whether BigQuery should allow extra values that are not represented in the table schema. +% +% WriteChannelConfiguration.Builder setMaxBadRecords(Integer maxBadRecords) +% Sets the maximum number of bad records that BigQuery can ignore when running the job. +% +% WriteChannelConfiguration.Builder setNullMarker(String nullMarker) +% Sets the string that represents a null value in a CSV file. +% +% WriteChannelConfiguration.Builder setSchema(Schema schema) +% Sets the schema for the destination table. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/BigQuery.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/BigQuery.m new file mode 100644 index 0000000..d728e30 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/BigQuery.m @@ -0,0 +1,126 @@ +classdef BigQuery < gcp.bigquery.Object + % BIGQUERY Google Big Query Client Library for MATLAB + + % (c) 2020 MathWorks, Inc. + properties + ProjectId + Location + end + + + + methods + %% Constructor + function obj = BigQuery(varargin) + + % Implementing GBQ client + import com.google.cloud.bigquery.BigQuery; + import com.google.cloud.bigquery.BigQueryOptions; + + % Setting Logger for GBQ + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GCS'; + + % Looking for JVM locally and verifying whether current MATLAB + % version is supported (Version support starting R2018a) + if ~usejava('jvm') + write(logObj,'error','MATLAB must be used with the JVM enabled'); + end + if verLessThan('matlab','9.4') % R2018a + write(logObj,'error','MATLAB Release 2018a or newer is required'); + end + + % Check if input is for wrapping a GBQ client object or + % credentials to build a fresh client + if nargin==1 && isa(varargin{1},'com.google.cloud.bigquery.BigQueryImpl') + gbqJ = varargin{1}; % get client object + obj.Handle = gbqJ; % assigning MATLAB class handle for the client + gbqOptionsJ = gbqJ.getOptions; % get existing bigqueryoptions + obj.ProjectId = char(gbqOptionsJ.getProjectId); % set projectId + obj.Location = char(gbqOptionsJ.getLocation); % set location + else + % Fetching credentials from environment variable for creating an + % Authenticated Google BigQuery Client in MATLAB + % + % Note: Make sure steps in Documentation/Authentication.md has been followed + % check for explicit credential input + if nargin>0 && (isa(varargin{1},'string') || isa(varargin{1},'char')) + credentialsFilePath = which(varargin{1}); + % if file input argument not found on path + if isempty(credentialsFilePath) + write(logObj,'error',strcat('Could not find ', varargin{1},' on path')); + end + else + try + % Load credentials for client using default + % credentials configured by user + credentialsFilePath = getenv('GOOGLE_APPLICATION_CREDENTIALS'); + catch + warning('Expected input credentials file on path or an existing json file(credentials.json) containing credentials within %s\config',gbqroot); + credentialsFilePath = ''; + end + end + + % Check for a valid credentials Path + if ~isempty(credentialsFilePath) + import com.google.auth.oauth2.GoogleCredentials; + % Read credentials from file + fileStreamJ = javaObject('java.io.FileInputStream',credentialsFilePath); + % Create service credentials + credentialsJ = javaMethod('fromStream','com.google.auth.oauth2.GoogleCredentials',fileStreamJ); + + % Use the BigQueryOptions.getDefaultInstance() function to use the default authentication options. + gbqOptions = gcp.bigquery.BigQueryOptions.getDefaultInstance; + + % Create the BigQueryOptions.Builder object to set credentials + gbqOptionsBuilder = gbqOptions.newBuilder(); + gbqOptionsBuilder = gbqOptionsBuilder.setCredentials(credentialsJ); + + % Build the BigQueryOptions.Builder object with credentials to get + % BigQueryOptions with given authentication details + gbqOptions = gbqOptionsBuilder.build(); + gbqOptionsJ = gbqOptions.Handle; + + % Use the BigQueryOptions.getService() function to create the authenticated BigQuery client. + gbqJ = gbqOptionsJ.getService; + obj.Handle = gbqJ; + + % Get ProjectId for assigning the Handle Property + gbqProjectId = char(gbqOptionsJ.getProjectId); + obj.ProjectId = gbqProjectId; + obj.Location = char(gbqOptionsJ.getLocation); + else + write(logObj,'error','Could not find a valid credentials to authenticate a client'); + end % if for credentials file exists + + end %else part of check where inputs are expected to be credentials and not a bigquery object + + end % constructor + + % method for setting a location for GBQ client + function gbq = setLocation(gbqclient,location) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(gbqclient,'gcp.bigquery.BigQuery') + write(logObj,'error','Input BigQuery Object was of an unexpected class '); + else + gbqJ = gbqclient.Handle; + gbqOptionsJ = gbqJ.getOptions; + gbqOptions = gcp.bigquery.BigQueryOptions(gbqOptionsJ); + gbqOptionsBuilder = gbqOptions.newBuilder; + gbqOptionsBuilder = gbqOptionsBuilder.setLocation(location); + gbqOptions = gbqOptionsBuilder.build; + gbqOptionsJ = gbqOptions.Handle; + + % Use the BigQueryOptions.getService() function to create the authenticated BigQuery client. + gbqJ = gbqOptionsJ.getService; + + % Wrap the java object gbqJ to MATLAB class object gbq + gbq = gcp.bigquery.BigQuery(gbqJ); + end + end + end %methods + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/create.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/create.m new file mode 100644 index 0000000..4d36913 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/create.m @@ -0,0 +1,110 @@ +function result = create(gbq, varargin) +% CREATE Method to create a bigquery dataset and job +% +% This method supports creating datasets and jobs. It does not support +% creating new bigquery table from scratch with scehma. +% Bigquery table creations are supported as a result of queries returning results into a temporary or permanent tables +% +% create() method depends on options such as `DatasetOption` and +% `JobOption` for creating datasets and jobs respectively. Find more about +% Options under +gcp/+Bigquery/ +% +% Usage +% +% Create a dataset: +% +% gbq = gcp.bigquery.BigQuery("credentials.json"); +% datasetId = gcp.bigquery.DatasetId.of("datasetname"); +% datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); +% datasetField = gcp.bigquery.BigQuery.DatasetField.valueOf +% datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField) +% dataset = gbqclient.create(datasetInfo,datasetOption); +% +% Create a query job: +% +% gbq = gcp.bigquery.BigQuery("credentials.json"); +% jobField = gcp.bigquery.BigQuery.JobField.values; +% jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); +% randomJobId = gcp.bigquery.JobId.createJobId(); +% jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); +% query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; +% queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); +% queryJobConfiguration = queryJobConfigurationBuilder.build; +% jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; +% job = gbq.create(jobInfo,jobOptions); +% +% Creating an empty table: +% +% % Create Table definition: +% StandardTableDefinitionBuilder = gcp.bigquery.StandardTableDefinition.newBuilder(); +% StandardTableDefinition = StandardTableDefinitionBuilder.build(); +% +% % Create TableId for a table and a given dataset +% tableId = gcp.bigquery.TableId.of("existing_dataset","new_gbq_tablename") +% +% % Create TableInfo: +% tableInfo = gcp.bigquery.TableInfo.of(tableId,StandardTableDefinition); +% +% % Create TableField and TableOption +% tableFields = gcp.bigquery.BigQuery.TableField.values +% tableOption = gcp.bigquery.BigQuery.TableOption.fields(tableFields) +% +% % Create a new and empty table +% gbqclient.create(tableInfo,tableOption) + +% (c) 2020 MathWorks, Inc. + + +%% Get java client for bigquery using the Handle of the MATLAB class object gbq +gbqJ = gbq.Handle; + +% Access second input argument and check for class +% Switch case for classes jobInfo, TableInfo and DatasetInfo +switch(class(varargin{1})) + case 'gcp.bigquery.JobInfo' + jobInfo = varargin{1}.Handle; + jobOption = varargin{2}.Handle; + + jobOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$JobOption',1); + jobOptionArray(1) = jobOption; + % Creating Job + jobj = gbqJ.create(jobInfo,jobOptionArray); + result = gcp.bigquery.Job(jobj); + + case 'gcp.bigquery.TableInfo' + tableInfo = varargin{1}.Handle; + tableOption = varargin{2}.Handle; + + tableOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$TableOption',1); + tableOptionArray(1) = tableOption; + % Empty Table + tablej = gbqJ.create(tableInfo,tableOptionArray); + result = gcp.bigquery.Table(tablej); + + case 'gcp.bigquery.DatasetInfo' + datasetInfo = varargin{1}.Handle; + datasetOption = varargin{2}.Handle; + + datasetOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$DatasetOption',1); + datasetOptionArray(1) = datasetOption; + + % Create dataset + datasetj = gbqJ.create(datasetInfo,datasetOptionArray); + result = gcp.bigquery.Dataset(datasetj); +end + +end %function + +%% Supported Java methods +% +% Dataset create(DatasetInfo datasetInfo, BigQuery.DatasetOption... options) +% Creates a new dataset. +% +% Job create(JobInfo jobInfo, BigQuery.JobOption... options) +% Creates a new job. +% +% Table create(TableInfo tableInfo, BigQuery.TableOption... options) +% Creates a new table. +% \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteDataset.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteDataset.m new file mode 100644 index 0000000..7bc791c --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteDataset.m @@ -0,0 +1,47 @@ +function tf = deleteDataset(gbq, varargin) +% DELETEDATASET Method to delete a dataset +% +% Usage +% +% gbq = gcp.bigquery.BigQuery() +% tf = gbq.deleteDataset('datasetid') + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Access gbq java client handle +clientObj = gbq.Handle; + +% Access datasetId as string +if ~isempty(varargin{1}) + datasetId = varargin{1}; + if isa(datasetId,'string') || isa(datasetId,'char') + datasetId = string(datasetId); + + % Create datasetDeleteOption + datasetDeleteOption = gcp.bigquery.BigQuery.DatasetDeleteOption.deleteContents(); + datasetDeleteOptionsJ = javaArray('com.google.cloud.bigquery.BigQuery$DatasetDeleteOption',1); + datasetDeleteOptionsJ(1) = datasetDeleteOption.Handle; + % Delete dataset + tf = clientObj.delete(datasetId,datasetDeleteOptionsJ); + if tf + fprintf("\nDataset deleted successfully\n"); + else + fprintf("\nDataset not deleted successfully\n"); + end + else + warning("expecting input argument to be a string"); + end +else + warning("Expecting datasetid to be passed as an input argument of type String"); +end + + + +% +%% + +end %function +% boolean delete(String datasetId, BigQuery.DatasetDeleteOption... options) +% Deletes the requested dataset. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteTable.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteTable.m new file mode 100644 index 0000000..5bdda6f --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/deleteTable.m @@ -0,0 +1,31 @@ +function tf = deleteTable(gbq, TableId) +% DELETETABLE Method to delete a table +% +% Usage +% +% gbq = gcp.bigquery.BigQuery() +% tf = gbq.deleteTable(TableId) + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Access gbq java client handle +clientObj = gbq.Handle; + +tableIdJ = TableId.Handle; + +% Returns true/false based on success of the deleteion +tf = clientObj.delete(tableIdJ); + +if tf + fprintf("\nDataset deleted successfully\n"); +else + fprintf("\nDataset not deleted successfully\n"); +end + + +end %function + +% boolean delete(String datasetId, BigQuery.DatasetDeleteOption... options) +% Deletes the requested dataset. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getDataset.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getDataset.m new file mode 100644 index 0000000..325410c --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getDataset.m @@ -0,0 +1,69 @@ +function Dataset = getDataset(gbq, varargin) +% GETDATASET Method to request an existing dataset +% +% This method will call the Google Big Query project configured to request +% a list of projects. +% +% Usage +% +% gbq = gcp.bigquery.BigQuery('credentials.json') +% dataSet = gbq.getDataset(datasetId); ,where datsetId is of type "gcp.bigquery.DatasetId" +% or +% dataSet = gbq.getDataset("datasetId"); , where datasetId is of type string or char + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Check for the correct number of input arguments +if ~isequal(numel(varargin),1) + write(logObj,'error','Unexpected number of Inputs'); +else + % Check for GBQ client + if ~ isa(gbq,'gcp.bigquery.BigQuery') + write(logObj,'error','Expecting an object of class gcp.bigquery.BigQuery'); + else + % access java client object + gbqJ = gbq.Handle; + if ~ isa(gbqJ,'com.google.cloud.bigquery.BigQueryImpl') + write(logObj,'error','Expecting an object of class com.google.cloud.bigquery.BigQueryImpl'); + else + % create metadata fields which need to be extracted for a given dataset + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % option for extracting dataset handle with fields as inputs + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + datasetOptions = javaArray('com.google.cloud.bigquery.BigQuery$DatasetOption',1); + datasetOptions(1) = datasetOption.Handle; + + % Extracting dataset based on datasetId + % Based on provided input arguments type 'string', 'char', + % 'DatasetId' support for methods + switch(class(varargin{1})) + case 'string' + datasetId = varargin{1}; + Dataset = gcp.bigquery.Dataset(gbqJ.getDataset(datasetId,datasetOptions)); + case 'char' + datasetId = varargin{1}; + Dataset = gcp.bigquery.Dataset(gbqJ.getDataset(datasetId,datasetOptions)); + case 'gcp.bigquey.DatasetId' + datasetIdJ = varargin{1}.Handle; + Dataset = gcp.bigquery.Dataset(gbqJ.getDataset(datasetIdJ,datasetOptions)); + otherwise + write(logObj,'error','Expected inputs are DatasetId of class string or gcp.bigquery.DatasetId'); + + end % switch - check class of DatasetId + + end % if - check class of gbq Handle + + end % if - check class of obj + +end % if - check number of inputs + +end %function \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getJob.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getJob.m new file mode 100644 index 0000000..2bd3108 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getJob.m @@ -0,0 +1,59 @@ +function Job = getJob(gbq, varargin) +% GETJOB Method to request an existing job using the jobid +% +% Usage +% +% gbq = gcp.bigquery.BigQuery('credentials.json') +% job = gbq.getJob(jobId); ,where jobId is of type "gcp.bigquery.JobId" +% +% or +% +% job = gbq.getJob("jobId"); , where jobId is of type string or char + +% (c) 2020 MathWorks, Inc. + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +if ~isequal(numel(varargin),1) + write(logObj,'error','Unexpected number of Inputs'); +else + % Check for GBQ client + if ~ isa(gbq,'gcp.bigquery.BigQuery') + write(logObj,'error','Expecting an object of class gcp.bigquery.BigQuery'); + else + gbqJ = gbq.Handle; + if ~ isa(gbqJ,'com.google.cloud.bigquery.BigQueryImpl') + write(logObj,'error','Expecting an object of class com.google.cloud.bigquery.BigQueryImpl'); + else + jobField = gcp.bigquery.BigQuery.JobField.values; + jobOption = gcp.bigquery.BigQuery.JobOption.fields(jobField); + jobOptions = javaArray('com.google.cloud.bigquery.BigQuery$JobOption',1); + jobOptions(1) = jobOption.Handle; + + switch(class(varargin{1})) + case 'string' + jobId = string(varargin{1}); %string + Job = gcp.bigquery.Job(gbqJ.getJob(jobId,jobOptions)); + case 'char' + jobId = string(varargin{1}); %string + Job = gcp.bigquery.Job(gbqJ.getJob(jobId,jobOptions)); + case 'gcp.bigquey.JobId' + jobIdJ = varargin{1}.Handle; + Job = gcp.bigquery.Job(gbqJ.getJob(jobIdJ,jobOptions)); + otherwise + write(logObj,'error','Expected input is JobId of class string or class gcp.bigquery.JobId'); + + end % switch - check class of JobId + + end % if - check class of gbq Handle + + end % if - check class of obj + +end % if - check number of inputs + +end %function \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getTable.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getTable.m new file mode 100644 index 0000000..a3189b8 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/getTable.m @@ -0,0 +1,64 @@ +function Table = getTable(gbq, varargin) +% GETTABLE Method to request an existing bigquery TABLE +% +% Usage +% +% gbq = gcp.bigquery.BigQuery('credentials.json') +% gbqtable = gbq.getTable('datasetId','tableId'); + +% (c) 2020 MathWorks, Inc. + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Checking if the number of input arguments are either 1-2 +if numel(varargin)< 1 || numel(varargin)> 2 + write(logObj,'error','Unexpected number of Inputs'); +else + % Check for GBQ client + if ~ isa(gbq,'gcp.bigquery.BigQuery') + write(logObj,'error','Expecting an object of class gcp.bigquery.BigQuery'); + else + % Get java class object from client object gbq + gbqJ = gbq.Handle; + if ~ isa(gbqJ,'com.google.cloud.bigquery.BigQueryImpl') + write(logObj,'error','Expecting an object of class com.google.cloud.bigquery.BigQueryImpl'); + else + % provide table fields for creating TableOptions for extracting + % Table handle of an existing Table within a bigquery dataset + tableField = gcp.bigquery.BigQuery.TableField.values; + tableOption = gcp.bigquery.BigQuery.TableOption.fields(tableField); + tableOptions = javaArray('com.google.cloud.bigquery.BigQuery$TableOption',1); + tableOptions(1) = tableOption.Handle; + + % Extract handle to an existing table with combination of input + % arguments such as datasetId and tableId or just unique + % tableId + switch(class(varargin{1})) + case 'string' + datasetId = string(varargin{1}); %string + tableId = string(varargin{2}); %string + Table = gcp.bigquery.Table(gbqJ.getTable(datasetId,tableId,tableOptions)); + case 'char' + datasetId = string(varargin{1}); %string + tableId = string(varargin{2}); %string + Table = gcp.bigquery.Table(gbqJ.getTable(datasetId,tableId,tableOptions)); + case 'gcp.bigquey.TableId' + tableIdJ = varargin{1}.Handle; + Table = gcp.bigquery.Table(gbqJ.getTable(tableIdJ,tableOption)); + otherwise + write(logObj,'error','Expected inputs are either DatasetId & TableId of class string or just Table Id of class gcp.bigquery.TableId'); + + end % switch - check class of DatasetId + + end % if - check class of gbq Handle + + end % if - check class of obj + +end % if - check number of inputs + +end %function \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listDatasets.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listDatasets.m new file mode 100644 index 0000000..466c63c --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listDatasets.m @@ -0,0 +1,88 @@ +function dtable = listDatasets(gbq, varargin) +% LISTDATASETS Method to list the project's datasets +% +% Usage: +% +% % create gbq client +% gbq = gcp.bigquery.BigQuery('credentials.json'); +% +% % create options/configs for how to list datasets +% datasetListOption1 = ... +% gcp.bigquery.BigQuery.DatasetListOption.all/labelFilter/pageSize/pageToken(input); +% +% datasetList = gbq.listDatasets(datsetListOption1,....,datasetListOptionN); +% + +% (c) 2020 MathWorks, Inc. + +%% Accessing GBQ client Handle +gbqJ = gbq.Handle; + +% Create DatasetListOptions + +% Expecting 1 or more DatasetListOption as input arguments +n = numel(varargin); + +% Checking for number of input arguments +if n < 1 + warning('You need to provide atleast one datasetListOption'); +else + % Creating array of DatasetListOptions with n as size + datasetlistOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$DatasetListOption',n); + + % cnt is a flag + cnt = 0; + + % Iterate over input arguments + for i = 1:numel(varargin) + + % Check for class of every input argument + if isa(varargin{i},'gcp.bigquery.BigQuery.DatasetListOption') + + % Assign to array if class of input argument is as expected + datasetlistOptionArray(i) = varargin{i}.Handle; + + % increment counter - sets flag to true + cnt = cnt+1; + else + % incorrect class of input argument + warning('Input needs to be of type gcp.bigquery.BigQuery.DatasetListOption'); + end + % Array assignment completion + end + % Check flag for atleast one assignment to the array + + if cnt < 1 + warning('DatasetListOptions could not be created due to incorrect input types'); + else + % List datasets for this project + datasetlist = gbqJ.listDatasets(datasetlistOptionArray); + + % Iterate over datasets in this project + datasetall = datasetlist.iterateAll; + + % Creating iterator + datasetiterator = datasetall.iterator; + + % Dataset Table; + dtable = table; + % List datasets + while datasetiterator.hasNext + cdataset = datasetiterator.next; + datasetid = cdataset.getDatasetId; + generationid = cdataset.getGeneratedId; + dtable = vertcat(dtable,table(string(datasetid.getDataset),string(generationid))); %#ok<*AGROW> + end + % Check if datasets exist for listing + if isequal(size(dtable,1),0) + fprintf('No datasets to list in the project %s',string(datasetId)); + else + % Setting Column names for dataset listing table information of this project + dtable.Properties.VariableNames= {'DatasetId','GenerationId'}; + end + + end %if + +end % if + +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listJobs.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listJobs.m new file mode 100644 index 0000000..897ea8e --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listJobs.m @@ -0,0 +1,88 @@ +function jtable = listJobs(gbq, varargin) +% LISTJOBS Method to list the project's jobs +% +% Usage: +% +% % create gbq client +% gbq = gcp.bigquery.BigQuery('credentials.json'); +% +% % create options/configs for listing jobs +% jobListOption1 = ... +% gcp.bigquery.BigQuery.JobListOption.pageSize/pageToken/parentJobId(input); +% +% jobList = gbq.listJobs(jobListOption1,....,jobListOptionN); +% + +% (c) 2020 MathWorks, Inc. + +%% Accessing GBQ client Handle +gbqJ = gbq.Handle; + +% Create jobListOptions + +% Expecting 1 or more jobListOption as input arguments +n = numel(varargin); + +% Checking for number of input arguments +if n < 1 + warning('You need to provide atleast one JobListOption'); +else + % Creating array of JobListOptions with n as size + joblistOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$JobListOption',n); + + % cnt is a flag + cnt = 0; + + % Iterate over input arguments + for i = 1:numel(varargin) + + % Check for class of every input argument + if isa(varargin{i},'gcp.bigquery.BigQuery.JobListOption') + + % Assign to array if class of input argument is as expected + joblistOptionArray(i) = varargin{i}.Handle; + + % increment counter - sets flag to true + cnt = cnt+1; + else + % incorrect class of input argument + warning('Input needs to be of type gcp.bigquery.BigQuery.JobListOption'); + end + % Array assignment completion + end + % Check flag for atleast one assignment to the array + + if cnt < 1 + warning('JobtListOptions could not be created due to incorrect input types'); + else + % List jobs for this project + joblist = gbqJ.listJobs(joblistOptionArray); + + % Iterate over jobs in this project + joball = joblist.iterateAll; + + % Creating iterator + jobiterator = joball.iterator; + + % Table listing Jobs in the project; + jtable = table; + % Parsing job list pages + while jobiterator.hasNext + cjob = jobiterator.next; + jobid = cjob.getJobId; + generationid = cjob.getGeneratedId; + jtable = vertcat(jtable,table(string(jobid),string(generationid))); %#ok<*AGROW> + end + % Check if jobs exist for listing + if isequal(size(jtable,1),0) + fprintf('No jobs to list in the project %s',string(datasetId)); + else + % Setting Column names for table listing job information of this project + jtable.Properties.VariableNames= {'JobId','GenerationId'}; + end + + end %if + +end % if + +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listTables.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listTables.m new file mode 100644 index 0000000..348aa7c --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/listTables.m @@ -0,0 +1,62 @@ +function dtable = listTables(gbq, datasetId) +% LISTTABLES Method to list the tables in the dataset +% +% gbq = gcp.bigquery.BigQuery('credentials.json'); +% tableList = gbq.listTables('datasetId'); +% + +% (c) 2020 MathWorks, Inc. + + % Access Java Handle + gbqJ = gbq.Handle; + + % Creating array of TableListOptions with size 1 + tableListOption = gcp.bigquery.BigQuery.TableListOption.pageSize(100); + tableListOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$TableListOption',1); + tableListOptionArray(1) = tableListOption.Handle; + + % Call listTables method of the gbq client with a datasetId and options for + % listing table information + tableList = gbqJ.listTables(datasetId,tableListOptionArray); + + % Iterate over datasets in this project + tableall = tableList.iterateAll; + + % Creating iterator + tableiterator = tableall.iterator; + + % Dataset Table Info container; + dtable = table; + + % List datasets + while tableiterator.hasNext + % Accessing next table + ctable = tableiterator.next; + + % Accessing information such as tableid and generation id of the + % current table + tableid = ctable.getTableId; + generationid = ctable.getGeneratedId; + % Adding row to the table listing ingormation about tables of this + % project + % Information consists of DatasetId, TableId and GenerationId + dtable = vertcat(dtable,table(string(tableid.getDataset),string(tableid.getTable),string(generationid))); %#ok<*AGROW> + + end + + % Check if tables exist for listing + if isequal(size(dtable,1),0) + fprintf('No tables to list in the dataset %s',string(datasetId)); + else + % Setting Column names for table listing table information of this project + dtable.Properties.VariableNames= {'Dataset','Table','GenerationId'}; + end + +end %function + + +%% Supported methods +% com.google.api.gax.paging.Page listTables(DatasetId datasetId, +% BigQuery.TableListOption... options) +% com.google.api.gax.paging.Page
listTables(String datasetId, +% BigQuery.TableListOption... options) diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/query.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/query.m new file mode 100644 index 0000000..34a29a4 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQuery/query.m @@ -0,0 +1,61 @@ +function TableResult = query(gbq, varargin) +% QUERY Method to Run the query associated with the request, using an internally-generated random JobId. +% +% Usage +% +% Synchronous/Interactive jobs: +% +% smallquery = 'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'; +% queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(smallquery); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +% queryJobConfiguration = queryJobConfigurationBuilder.build +% +% tableResult = gbq.query(queryJobConfiguration) +% matlabtable = gbq2table(tableResult) +% +% +% Asynchronous/Batch query jobs: +% +% +% query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40000;"; +% queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setDestinationTable(tableId); +% queryJobConfiguration = queryJobConfigurationBuilder.build +% +% jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; +% job = gbq.create(jobInfo,jobOptions) +% job.waitFor +% +% queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100) +% tableResult = job.getQueryResults(queryResultsOption) +% +% Note: Alternatively query results can be loaded to Google Cloud storage +% bucket and downloaded using ExtractJob +% + +% (c) 2020 MathWorks, Inc. + + +%% Set default Property-Value Pairs (Comment/Delete this section if not used) + +% Accessing Google Big Query client Handle +gbqJ = gbq.Handle; + +% Assigning queryJobconfiguration input arguments +queryJobConfiguration = varargin{1}; + +% Creating Job Options +JobField = gcp.bigquery.BigQuery.JobField.values; +JobOption = gcp.bigquery.BigQuery.JobOption.fields(JobField); +JobOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$JobOption',1); +JobOptionArray(1) = JobOption.Handle; + +% Submit query with the job options and input query job configuration +TableResultJ = gbqJ.query(queryJobConfiguration.Handle, JobOptionArray); + +% Package Table Results into a MATLAB class object +TableResult = gcp.bigquery.TableResult(TableResultJ); + +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@BigQueryOptions/BigQueryOptions.m b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQueryOptions/BigQueryOptions.m new file mode 100644 index 0000000..33fbafd --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@BigQueryOptions/BigQueryOptions.m @@ -0,0 +1,78 @@ +classdef BigQueryOptions < gcp.bigquery.Object +% BigQueryOptions Google BigQueryOptions for building a BigQuery client +% +% +% Usage +% +% No explicit usage. This class and it's methods are used in the process of +% creating a Bigquery client within the class Bigquery + + +% (c) 2020 MathWorks, Inc. + + + properties + end + + methods + %% Constructor + function obj = BigQueryOptions(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(varargin{1},'com.google.cloud.bigquery.BigQueryOptions') + write(logObj,'error','BigQueryOptions class object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + function bigQueryOptionsBuilder = newBuilder(obj) + if ~ isa(obj.Handle,'com.google.cloud.bigquery.BigQueryOptions') + write(logObj,'error','BigQueryOptions class object expected as input argument to newBuilder()'); + else + bigQueryOptionsJ = obj.Handle; + bigQueryOptionsBuilder = bigQueryOptionsJ.newBuilder(); + bigQueryOptionsBuilder = gcp.bigquery.BigQueryOptions.Builder(bigQueryOptionsBuilder); + end + end + + end + + methods (Static) + + function bigQueryOptions = getDefaultInstance() + % Implementing GBQ client + import com.google.cloud.bigquery.BigQuery; + import com.google.cloud.bigquery.BigQueryOptions; + + % Setting Logger for gbq + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GCS'; + + % Looking for JVM locally and verifying whether current MATLAB version is supported + if ~usejava('jvm') + write(logObj,'error','MATLAB must be used with the JVM enabled'); + end + if verLessThan('matlab','9.4') % R2018a + write(logObj,'error','MATLAB Release 2018a or newer is required'); + end + % Use the BigQueryOptions.getDefaultInstance() function to use the default authentication options. + gbqOptionsJ = BigQueryOptions.getDefaultInstance(); + + bigQueryOptions = gcp.bigquery.BigQueryOptions(gbqOptionsJ); + end + end + +end %class + +% Reference API: https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/BigQueryOptions.html +% +% +% static com.google.cloud.http.HttpTransportOptions getDefaultHttpTransportOptions() +% +% static BigQueryOptions getDefaultInstance() +% +% static BigQueryOptions.Builder newBuilder() +% diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/Dataset.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/Dataset.m new file mode 100644 index 0000000..63fdb98 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/Dataset.m @@ -0,0 +1,55 @@ +classdef Dataset < gcp.bigquery.Object +% DATASET A Google BigQuery Dataset. +% +% Objects of this class are immutable. +% Dataset adds a layer of service-related functionality over DatasetInfo. +% +% Usage +% % create a client +% +% gbq = gcp.bigquery.BigQuery('credentials.json'); +% +% % create details such as Id,location etc to build a dataset +% +% datasetId = gcp.bigquery.DatasetId.of("datasetname"); +% datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); +% +% % create options/fields info which are to be returned when datasets +% are queries or listed +% +% datasetField = gcp.bigquery.BigQuery.DatasetField.valueOf +% datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField) +% +% % create a dataset +% +% dataset = gbqclient.create(datasetInfo,datasetOption); + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = Dataset(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verifying class of the input argument to the Dataset constructor + if ~ isa(varargin{1},'com.google.cloud.bigquery.Dataset') + write(logObj,'error','Dataset Object creation failed'); + else + % Expected class positively verified. Assigning object as a + % Hendle for MATLAB class object Dataset + obj.Handle = varargin{1}; + + % Uncomment for verbosity + % write(logObj,'debug','Dataset Handle created'); + end + end +end + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/delete.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/delete.m new file mode 100644 index 0000000..2d24a70 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/delete.m @@ -0,0 +1,45 @@ +function tf = delete(datasetobj) +% DELETE deletes current dataset and returns TRUE or FALSE depending +% on success of the deletion +% +% Usage +% +% tf = dataset.delete() + + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Access Dataset Handle +datasetJ = datasetobj.Handle; + +% Create datasetDeleteOption +datasetDeleteOption = gcp.bigquery.BigQuery.DatasetDeleteOption.deleteContents(); + +% There could be multiple datasetDeleteOptions one might want to create. In +% that case One can use an array of deletedatasetoption such as one created +% below. Size of an array can be provided based on number of options. +datasetDeleteOptionsJ = javaArray('com.google.cloud.bigquery.BigQuery$DatasetDeleteOption',1); + +% Assigning the datasetDeleteOption to the array +datasetDeleteOptionsJ(1) = datasetDeleteOption.Handle; + +% Delete table +tf = datasetJ.delete(datasetDeleteOptionsJ); + +if tf + fprintf("\nDataset deleted successfully\n"); + % clear datasetobj; +else + fprintf("\nDataset not deleted successfully\n"); +end +end %function + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/exists.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/exists.m new file mode 100644 index 0000000..ef97798 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Dataset/exists.m @@ -0,0 +1,30 @@ +function tf = exists(datasetobj, varargin) +% EXISTS Method - checks if current dataset exists and returns boolean +% status +% +% tf = dataset.exists() + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Access Dataset Handle +datasetJ = datasetobj.Handle; + +% Check for dataset +tf = datasetJ.exists(); + +if tf + fprintf("\nDataset exists \n"); +else + fprintf("\nDataset does not exist \n"); +end +end %function + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetId/DatasetId.m b/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetId/DatasetId.m new file mode 100644 index 0000000..4d2d701 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetId/DatasetId.m @@ -0,0 +1,101 @@ +classdef DatasetId < gcp.bigquery.Object + % DATASETID Google BigQuery Dataset identity. + % + % Usage: + % + % Create a datasetid for a new dataset on BigQuery + % + % gbqclient = gcp.bigquery.Bigquery(credentials.json); + % projectId = gbqclient.ProjectId; + % + % 1. datasetId = gcp.bigquery.DatasetId.of("datasetname"); + % 2. datasetId = gcp.bigquery.DatasetId.of(projectId,"datasetname"); + % + % (c) 2020 MathWorks, Inc. + + properties + end + + methods + %% Constructor + + function obj = DatasetId(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Check for DatasetId object class before assigning Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.DatasetId') + write(logObj,'error','DatasetId Object creation failed'); + else + % Assign java object DatasetId to Handle for MATLAB class + % object gcp.bigquery.DatasetId + obj.Handle = varargin{1}; + end + end + end + + methods(Static) + function datasetId = of(varargin) + % imports + import com.google.cloud.bigquery.BigQuery; + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Switch case to implement multiple methods based on number and + % type of input arguments + switch numel(varargin) + case 1 + % Expecting single input argument to be the datsetId + dataset = varargin{1}; + if ~isa(varargin{1},'string') && ~isa(varargin{1},'char') + write(logObj,'error','Expected input argument to be a dataset name in string format'); + else + % Create a DatasetId, with string name of dataset + datasetIdJ = javaMethod('of','com.google.cloud.bigquery.DatasetId',dataset); + + % wrapping into a MATLAB class object gcp.bigquery.DatasetId using + % the above constructor + datasetId = gcp.bigquery.DatasetId(datasetIdJ); + end + + case 2 + % Expecting 2 input arguments to be the datsetId and + % projectid + projectid = varargin{1}; + dataset = varargin{2}; + if ~isa(varargin{1},'string') && ~isa(varargin{1},'char') + write(logObj,'error','Expected input argument to be a dataset name in string format'); + else + % Create a DatasetId, with projectid and datasetname - both + % of type string + datasetIdJ = javaMethod('of','com.google.cloud.bigquery.DatasetId',projectid,dataset); + + % wrapping into a MATLAB class object gcp.bigquery.DatasetId using + % the above constructor + datasetId = gcp.bigquery.DatasetId(datasetIdJ); + end + + otherwise + write(logObj,'error','Unexpected number of inputs') + + end %switch + + end % function + + end % methods(Static) + +end %class +% +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/DatasetId.html +% +% Java API - Supported methods +% +% static DatasetId of(String dataset) +% Creates a dataset identity given only its user-defined id. +% +% static DatasetId of(String project, String dataset) +% Creates a dataset identity given project's and dataset's user-defined ids. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetInfo/DatasetInfo.m b/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetInfo/DatasetInfo.m new file mode 100644 index 0000000..dce9a1a --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@DatasetInfo/DatasetInfo.m @@ -0,0 +1,146 @@ +classdef DatasetInfo < gcp.bigquery.Object +% DATASETINFO Google BigQuery Dataset information. +% +% A dataset is a grouping mechanism that holds zero or more tables. +% Datasets are the lowest level unit of access control. +% Google BigQuery does not allow control access at the table level. +% +% Usage +% +% gbqclient = gcp.bigquery.Bigquery('credentials.json'); +% projectId = gbqclient.ProjectId; +% datasetId = gcp.bigquery.DatasetId.of(projectId,"datasetname"); +% +% datasetInfoBuilder = gcp.bigquery.DatasetId.newBuilder(projectId,datasetId); +% datasetInfoBuilder = datasetInfoBuilder.setLocation("location"); +% datasetInfo = datasetInfoBuilder.build(); +% +% or +% +% datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = DatasetInfo(varargin) + % Wraps DatasetInfo java object to a MATLAB object + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Constructor checks for the expected java class object + if ~ isa(varargin{1},'com.google.cloud.bigquery.DatasetInfo') + % Log error if class is different + write(logObj,'error','DatasetInfo Object creation failed'); + else + % If received object is of the expected class, assign it to the + % class Handle for DatasetInfo + obj.Handle = varargin{1}; + end + + end +end + +methods(Static) + + % Creates a datasetInfo based on datasetId only + function datasetInfo = of(varargin) + % This method takes datasetId as input and returns a datasetInfo + % object + + % imports + import com.google.cloud.bigquery.BigQuery; + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Expecting DatasetId as an input argument + % Single input argument expected + if ~isequal(numel(varargin),1) + write(logObj,'error','Unexpected number of inputs') + elseif isa(varargin{1},'string') || isa(varargin{1},'char') + datasetid = string(varargin{1}.Handle); + elseif isa(varargin{1},'gcp.bigquery.DatasetId') + datasetid = varargin{1}.Handle; + else + write(logObj,'error','Unexpected class for input argument') + end + % Create a DatasetInfo, with datasetId + datasetInfoJ = javaMethod('of','com.google.cloud.bigquery.DatasetInfo',datasetid); + + % wrapping into a MATLAB class object + datasetInfo = gcp.bigquery.DatasetInfo(datasetInfoJ); + + end % function + + % Allows user to add input configurations for using a Builder object to + % create datasetInfo + function datasetInfoBuilder = newBuilder(varargin) + if nargin==1 + datasetId = varargin{1}; + switch class(datasetId) + case 'string' + % Building datasetInfo.Builder object with just + % datasetId of type string + datasetInfoBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.DatasetInfo',datasetId); + % wrapping java Object into a MATLAB class Object DatasetInfo.Builder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + case 'char' + % Building datasetInfo.Builder object with just + % datasetId of type char + datasetInfoBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.DatasetInfo',datasetId); + % wrapping java Object into a MATLAB class Object DatasetInfo.Builder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + case 'gcp.bigquery.DatasetId' + % Building datasetInfo.Builder object with just + % datasetId of type gcp.bigquery.DatasetId + datasetInfoBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.DatasetInfo',datasetId.Handle); + % wrapping java Object into a MATLAB class Object DatasetInfo.Builder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + otherwise + warning("Unexpected datatype for input argument datasetId") + end + elseif nargin==2 + projectId = varargin{1}; %string + datasetId = varargin{2}; %string + % Building datasetInfo.Builder object with projectId and + % datasetId + datasetInfoBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.DatasetInfo',projectId,datasetId); + % Wrapping java Object into a MATLAB class Object DatasetInfo.Builder + datasetInfoBuilder = gcp.bigquery.DatasetInfo.Builder(datasetInfoBuilderJ); + else + warning("Incorrect number of input arguments"); + end + end % function + +end % methods(Static) + +end %class + +%% +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/DatasetInfo.html +% +% Java API - Supported methods +% +% static DatasetInfo of(DatasetId datasetId) +% Returns a DatasetInfo object given it's identity. +% +% static DatasetInfo of(String datasetId) +% Returns a DatasetInfo object given it's user-defined id. +% +% static DatasetInfo.Builder newBuilder(DatasetId datasetId) +% Returns a builder for a DatasetInfo object given it's identity. +% +% static DatasetInfo.Builder newBuilder(String datasetId) +% Returns a builder for a DatasetInfo object given it's user-defined id. +% +% static DatasetInfo.Builder newBuilder(String projectId, String datasetId) +% Returns a builder for the DatasetInfo object given it's user-defined project and dataset ids. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@FormatOptions/FormatOptions.m b/Software/MATLAB/app/system/+gcp/+bigquery/@FormatOptions/FormatOptions.m new file mode 100644 index 0000000..a6f381e --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@FormatOptions/FormatOptions.m @@ -0,0 +1,120 @@ + classdef FormatOptions < gcp.bigquery.Object +% FORMATOPTIONS Base class for Google BigQuery format options. +% +% This class defines the format of external data consumed by BigQuery, for either federated tables or load jobs. +% Load jobs support the following formats: AVRO, CSV, JSON, ORC, PARQUET +% +% Usage +% +% formatOptions = gcp.bigquery.FormatOptions.csv() +% +% formatOptions = gcp.bigquery.FormatOptions.json() +% +% formatOptions = gcp.bigquery.FormatOptions.avro() +% +% formatOptions = gcp.bigquery.FormatOptions.parquet() +% +% formatOptions = gcp.bigquery.FormatOptions.orc() +% + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = FormatOptions(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify the java object class before wrapping it in the MATLAB object + % class + if ~ isa(varargin{1},'com.google.cloud.bigquery.FormatOptions') + write(logObj,'error','FormatOptions Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + + function formatOptions = csv() + % Returns csv formatoptions for source csv file + formatOptionsJ = javaMethod('csv','com.google.cloud.bigquery.FormatOptions'); + formatOptions = gcp.bigquery.FormatOptions(formatOptionsJ); + end + + function formatOptions = avro() + % Returns avro formatoptions for source avro file + formatOptionsJ = javaMethod('avro','com.google.cloud.bigquery.FormatOptions'); + formatOptions = gcp.bigquery.FormatOptions(formatOptionsJ); + end + + function formatOptions = orc() + % Returns orc formatoptions for source orc file + formatOptionsJ = javaMethod('orc','com.google.cloud.bigquery.FormatOptions'); + formatOptions = gcp.bigquery.FormatOptions(formatOptionsJ); + end + + function formatOptions = parquet() + % Returns parquet formatoptions for source parquet file + formatOptionsJ = javaMethod('parquet','com.google.cloud.bigquery.FormatOptions'); + formatOptions = gcp.bigquery.FormatOptions(formatOptionsJ); + end + + function formatOptions = json() + % Returns json formatoptions for source json file + formatOptionsJ = javaMethod('json','com.google.cloud.bigquery.FormatOptions'); + formatOptions = gcp.bigquery.FormatOptions(formatOptionsJ); + end +end + +end %class + +% +% Reference for API: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/FormatOptions.html +% +% Supported Methods: +% --------------------- +% static FormatOptions avro() +% Default options for AVRO format. +% +% static FormatOptions orc() +% Default options for the ORC format. +% +% static FormatOptions parquet() +% Default options for PARQUET format. +% +% static CsvOptions csv() +% Default options for CSV format. +% +% static FormatOptions json() +% Default options for NEWLINE_DELIMITED_JSON format. +% +% +% Unsupported Methods +% ------------------- +% static FormatOptions bigtable() +% Default options for BIGTABLE format. +% +% static FormatOptions datastoreBackup() +% Default options for DATASTORE_BACKUP format. +% +% boolean equals(Object obj) +% +% String getType() +% Returns the external data format, as a string. +% +% static FormatOptions googleSheets() +% Default options for GOOGLE_SHEETS format. +% +% int hashCode() +% +% static FormatOptions of(String format) +% Default options for the provided format. +% +% String toString() \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Job/Job.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/Job.m new file mode 100644 index 0000000..915b546 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/Job.m @@ -0,0 +1,45 @@ +classdef Job < gcp.bigquery.Object +% JOB Object to return the status of a job +% +% Create a query job: +% +% gbq = gcp.bigquery.BigQuery("credentials.json"); +% jobField = gcp.bigquery.BigQuery.JobField.values; +% jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); +% randomJobId = gcp.bigquery.JobId.createJobId(); +% jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); +% query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; +% queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); +% queryJobConfiguration = queryJobConfigurationBuilder.build; +% jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration).setJobId(jobId).build; +% job = gbq.create(jobInfo,jobOptions); +% +% The create() method internally calls this class to wrap the Job into a +% MATLAB object gcp.bigquery.Job + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + + function obj = Job(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verifying class of the input argument to the Dataset constructor + if ~ isa(varargin{1},'com.google.cloud.bigquery.Job') + write(logObj,'error','Job Object creation failed'); + else + obj.Handle = varargin{1}; + write(logObj,'debug','Job Handle created'); + end + end +end + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Job/getQueryResults.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/getQueryResults.m new file mode 100644 index 0000000..0dfd81c --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/getQueryResults.m @@ -0,0 +1,59 @@ +function tableResult = getQueryResults(job, varargin) +% GETQUERYRESULTS Returns TableResults for an asynchronous query job +% +% Usage +% +% % Creating options with which Job should be created +% +% jobField = gcp.bigquery.BigQuery.JobField.values; +% jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); +% +% % Creating Job Id +% +% randomJobId = gcp.bigquery.JobId.createJobId(); +% jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId) +% +% % Setting Query configuration and Job Id to JobInfo +% +% jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; +% +% % Job creation +% +% job = gbq.create(jobInfo,jobOptions) +% +% % Polling for job completion +% job.waitFor +% +% % Get Query Job Results +% % Setting options for the way you would want query results to be returned +% +% queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); +% +% % Receiving query results as object TableResult +% +% tableResult = job.getQueryResults(queryResultsOption) + + +% (c) 2020 MathWorks, Inc. + + +%% Implementation + +% Expecting input argument to be an object of type queryResultsOption +if (isa(varargin{1}.Handle,'com.google.cloud.bigquery.BigQuery$QueryResultsOption')) + % Getting java object from Handle + queryResultsOption = varargin{1}.Handle; + % Creating an empty array of type QueryResultsOption and size 1 + queryResultsOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$QueryResultsOption',1); + % Assign the java object to the array at index 1 + queryResultsOptionArray(1) = queryResultsOption; +end + +% Invoke the query result request to receive tableResults +tableResultJ = job.Handle.getQueryResults(queryResultsOptionArray); + +% Wrap java object tableResultsJ to a MATLAB object to be returned +tableResult = gcp.bigquery.TableResult(tableResultJ); + + +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Job/waitFor.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/waitFor.m new file mode 100644 index 0000000..519f596 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Job/waitFor.m @@ -0,0 +1,84 @@ +function waitFor(job, varargin) +% WAITFOR Blocks until this job completes its execution, either failing or succeeding. +% +% % Creating options with which Job should be created +% +% jobField = gcp.bigquery.BigQuery.JobField.values; +% jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); +% +% % Creating Job Id +% +% randomJobId = gcp.bigquery.JobId.createJobId(); +% jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId) +% +% % Setting Query configuration and Job Id to JobInfo +% +% jobInfo = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration1).setJobId(jobId).build; +% +% % Job creation +% +% job = gbq.create(jobInfo,jobOptions) +% +% % Polling for job completion +% job.waitFor +% +% % Get Query Job Results +% % Setting options for the way you would want query results to be returned +% +% queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); +% +% % Receiving query results as object TableResult +% +% tableResult = job.getQueryResults(queryResultsOption) + +% (c) 2020 MathWorks, Inc. + + +%% Set default Property-Value Pairs (Comment/Delete this section if not used) +% +import com.google.cloud.RetryOption; + +jobJ = job.Handle; + +% This class represents an options wrapper around the RetrySettings class and is an alternative way of initializing it. The retry options are usually provided in a form of varargs for methods that wait for changes in the status of a resource, +% do poll operations or retry on failures. +% +% Ref: https://googleapis.dev/java/google-cloud-clients/0.103.0-alpha/com/google/cloud/RetryOption.html + +% Creating a config for RetryAttempts +retryOption = javaMethod('maxAttempts','com.google.cloud.RetryOption',100); + +% Creating an array of configs for job retry +retryOptionArray = javaArray('com.google.cloud.RetryOption',1); + +% Assign retryattemps as an option in the array of retry options +retryOptionArray(1) = retryOption; + +% wait for the Job with the given retry options array +jobJ = jobJ.waitFor(retryOptionArray); + +% poll for job status +status = jobJ.getStatus; + +% flag for a successful job +flag = false; + +% check if status has an error field with error message +% If the error field is not empty set the flag to true +if ~isempty(status.getError) + fprintf("\n"); + status.getError + flag=true; % flag for errored job +end +if ~isempty(status.getExecutionErrors) + fprintf("\n"); + status.getExecutionErrors + flag=true; % flag for errored job +end +% If flag==false , there are no errors in this completed job +if(~flag) +if isequal("DONE",string(jobJ.getStatus.getState.toString())) + fprintf("\nJob completed\n"); +end +end +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@JobId/JobId.m b/Software/MATLAB/app/system/+gcp/+bigquery/@JobId/JobId.m new file mode 100644 index 0000000..a61dd49 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@JobId/JobId.m @@ -0,0 +1,123 @@ +classdef JobId < gcp.bigquery.Object +% JOBID Object to return the job identifier +% +% Usage +% +% % Creating a unique and random JobId - type string +% % Is used for creating the object JobId as shown below +% +% jobIdstr = gcp.bigquery.JobId.createJobId(); +% +% % Examples of creating jobId +% +% 1. jobIdBuilder = newBuilder() +% jobIdBuilder = jobIdBuilder.setLocation("location"); +% jobIdBuilder = jobIdBuilder.project("projectid"); +% jobId = jobIdBuilder.build; +% +% 2. jobId = gcp.bigquery.JobId.of() +% +% 3. jobId = gcp.bigquery.JobId.of(jobIdstr) +% +% 4. jobId = gcp.bigquery.JobId.of(projectId,jobIdstr) +% + +% (c) 2020 MathWorks, Inc. +properties +end + +methods + %% Constructor + function obj = JobId(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ (isa(varargin{1},'com.google.cloud.bigquery.JobId') || isa(varargin{1},'com.google.cloud.bigquery.AutoValue_JobId')) + write(logObj,'error','JobId object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods(Static) + function jobStr = createJobId(varargin) + % returns unique string for creating JobId object + % + % ISO 8601 + millisecs + prefixStr = 'job_'; + timestampStr = datestr(now,30); + sep = '_'; + milliStr = datestr(now,'FFF'); + [~,tempStr] = fileparts(tempname); + + % Create and return an jobId + jobStr = [prefixStr, timestampStr, sep, milliStr, sep, tempStr]; + + end + + function jobId = of(varargin) + import com.google.cloud.bigquery.*; + + % Setting logger + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Different ways of creating a JobId for a batch job + switch numel(varargin) + + case 0 + % Creates a job identity with autogenerated id and no project specified. + jobIdJ = javaMethod('of','com.google.cloud.bigquery.JobId'); + + case 1 + % Creates a job identity given only its user-defined id. + jobidstr = varargin{1}; + jobIdJ = javaMethod('of','com.google.cloud.bigquery.JobId',jobidstr); + + case 2 + % Creates a job identity given project's and job's user-defined id. + projectid = varargin{1}; + jobidstr = varargin{2}; + + jobIdJ = javaMethod('of','com.google.cloud.bigquery.JobId',projectid,jobidstr); + + % If you are getting project id errors it's possible your + % service account is not enabled to use the BigQuery API + otherwise + + write(logObj,'error','Unexpected number of Input arguments'); + end + + % Wrap java object jobIdJ created above into a MATLAB object + % gcp.bigquery.JobId using the constructor JobId() + jobId = gcp.bigquery.JobId(jobIdJ); + + end + + function jobIdBuilder = newBuilder() + + % Create Builder class for JobId + jobIdBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.JobId'); + % Wrapping the Java class object into a MATLAB object jobIdBuilder + jobIdBuilder = gcp.bigquery.JobId.Builder(jobIdBuilderJ); + end + +end + +end %class + +%% +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobId.html +% +% Java API - Supported methods +% +% static JobId of() +% Creates a job identity with autogenerated id and no project specified. +% +% static JobId of(String job) +% Creates a job identity given only its user-defined id. +% +% static JobId of(String project, String job) +% Creates a job identity given project's and job's user-defined id. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@JobInfo/JobInfo.m b/Software/MATLAB/app/system/+gcp/+bigquery/@JobInfo/JobInfo.m new file mode 100644 index 0000000..460a715 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@JobInfo/JobInfo.m @@ -0,0 +1,51 @@ +classdef JobInfo < gcp.bigquery.Object +%JOBINFO Google BigQuery Job information. +% +% Jobs are objects that manage asynchronous tasks such as running queries, loading data, and exporting data. +% Use QueryJobConfiguration for a job that runs a query. +% +% Usage +% +% jobInfoBuilder = gcp.bigquery.JobInfo.newBuilder(QueryJobConfiguration) +% jobInfo = jobInfoBuilder.build() + +% (c) 2020 MathWorks, Inc. + properties + + end + + methods + function obj = JobInfo(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + % Verify input class object and assigning Handle + if ~ (isa(varargin{1},'com.google.cloud.bigquery.JobInfo')) + write(logObj,'error','JobInfo object creation failed'); + else + obj.Handle = varargin{1}; + end + end + + end + + methods(Static) + + function jobInfoBuilder = newBuilder(QueryJobConfiguration) + + % Returns a builder for a JobInfo object given the job configuration. + jobInfoBuilder = javaMethod('newBuilder','com.google.cloud.bigquery.JobInfo',QueryJobConfiguration.Handle); + + % Wrap object into MATLAB class using the above constructor + jobInfoBuilder = gcp.bigquery.JobInfo.Builder(jobInfoBuilder); + end + end +end + +%% +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobInfo.html +% +% Java API - Supported methods +% +% static JobInfo.Builder newBuilder(JobConfiguration configuration) +% Returns a builder for a JobInfo object given the job configuration. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@LoadJobConfiguration/LoadJobConfiguration.m b/Software/MATLAB/app/system/+gcp/+bigquery/@LoadJobConfiguration/LoadJobConfiguration.m new file mode 100644 index 0000000..219d673 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@LoadJobConfiguration/LoadJobConfiguration.m @@ -0,0 +1,146 @@ +classdef LoadJobConfiguration < gcp.bigquery.Object +% LOADJOBCONFIGURATION Google BigQuery load job configuration. A load job loads data from one of several formats into a table. Data is provided as URIs that point to objects in Google Cloud Storage. +% Load job configurations have JobConfiguration.Type.LOAD type. +% +% Usage +% +% % Create builder for LoadJobConfiguration using either of the two methods +% +% LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(tableId,sourceUri); +% +% or +% +% LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,sourceUri,formatOptions); +% +% % Return LoadJobConfiguration by either building the LoadJobConfiguration.Builder or using the of() method in this class +% +% LoadJobConfiguration = LoadJobConfigurationBuilder.build; +% +% or +% +% LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(tableId,sourceUri,formatOptions); +% + +% (c) 2020 MathWorks, Inc. + + + properties + end + + methods + %% Constructor + function obj = LoadJobConfiguration(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + switch (class(varargin{1})) + case 'com.google.cloud.bigquery.LoadJobConfiguration' + obj.Handle = varargin{1}; + otherwise + write(logObj,'error','LoadJobConfiguration Object creation failed'); + end + + end + end + + methods (Static) + + % Creates a builder for a BigQuery Load Job configuration given the destination table and source URI. + % Both inputs are of string datatype: 'tablename' and 'gs:\\bucketname\blobname' + function LoadJobConfigurationBuilder = builder(tableId,sourceUri) + + % tableId is of class com.google.bigquery.TableId + % sourceUri is a string bucket url + % create configuration for load job + LoadJobConfigurationBuilderJ = javaMethod('builder','com.google.cloud.bigquery.LoadJobConfiguration',tableId.Handle,sourceUri); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + + end + + % Creates a builder for a BigQuery Load Job configuration given the destination table and source URIs. + function LoadJobConfigurationBuilder = newBuilder(varargin) + if isequal(nargin,2) + % tableId is of class com.google.bigquery.TableId + tableId = varargin{1}.Handle; + % sourceUri is a string bucket url + sourceUri = varargin{2}; + % create configuration for load job + LoadJobConfigurationBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.LoadJobConfiguration',tableId,sourceUri); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + elseif isequal(nargin,3) + % tableId is of class com.google.bigquery.TableId + tableId = varargin{1}.Handle; + % formatOption based on file extension on cloud storage + formatOptions = varargin{3}.Handle; + % sourceUri is a string bucket url + sourceUri = varargin{2}; + % create configuration for load job + LoadJobConfigurationBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.LoadJobConfiguration',tableId,sourceUri,formatOptions); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.Builder(LoadJobConfigurationBuilderJ); + else + warning('Incorrect number of input arguments'); + end + end + + % Returns a BigQuery Load Job Configuration for the given destination table, format Option and source URI + function LoadJobConfiguration = of(varargin) + if isequal(nargin,2) + % tableId is of class com.google.bigquery.TableId + tableId = varargin{1}.Handle; + % sourceUri is a string bucket url + sourceUri = varargin{2}; + % create configuration for load job + LoadJobConfigurationJ = javaMethod('of','com.google.cloud.bigquery.LoadJobConfiguration',tableId,sourceUri); + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration(LoadJobConfigurationJ); + elseif isequal(nargin,3) + % tableId is of class com.google.bigquery.TableId + tableId = varargin{1}.Handle; + % sourceUri is a string bucket url + sourceUri = varargin{2}; + % formatOption based on file extension on cloud storage + formatOptions = varargin{3}.Handle; + % create configuration for load job + LoadJobConfigurationJ = javaMethod('of','com.google.cloud.bigquery.LoadJobConfiguration',tableId,sourceUri,formatOptions); + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration(LoadJobConfigurationJ); + else + warning('Incorrect number of input arguments'); + end + end + + end %methods (Static) + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/LoadJobConfiguration.html +% +%% Supported Java APIs +% -------------------- +% static LoadJobConfiguration.Builder builder(TableId destinationTable, String sourceUri) +% Creates a builder for a BigQuery Load Job configuration given the destination table and source URI. +% +% static LoadJobConfiguration.Builder newBuilder(TableId destinationTable, String sourceUri) +% Creates a builder for a BigQuery Load Job configuration given the destination table and source URI. +% +% static LoadJobConfiguration.Builder newBuilder(TableId destinationTable, String sourceUri, FormatOptions format) +% Creates a builder for a BigQuery Load Job configuration given the destination table, format and source URI. +% +% static LoadJobConfiguration of(TableId destinationTable, String sourceUri) +% Returns a BigQuery Load Job Configuration for the given destination table and source URI. +% +% static LoadJobConfiguration of(TableId destinationTable, String sourceUri, FormatOptions format) +% Returns a BigQuery Load Job Configuration for the given destination table, format and source URI. + +%% Unsupported Java APIs +% -------------------- +% static LoadJobConfiguration.Builder newBuilder(TableId destinationTable, List sourceUris) +% Creates a builder for a BigQuery Load Job configuration given the destination table and source URIs. +% +% static LoadJobConfiguration.Builder newBuilder(TableId destinationTable, List sourceUris, FormatOptions format) +% Creates a builder for a BigQuery Load Job configuration given the destination table, format and source URIs. +% +% static LoadJobConfiguration of(TableId destinationTable, List sourceUris) +% Returns a BigQuery Load Job Configuration for the given destination table and source URIs. +% +% static LoadJobConfiguration of(TableId destinationTable, List sourceUris, FormatOptions format) +% Returns a BigQuery Load Job Configuration for the given destination table, format and source URI. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Object/Object.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Object/Object.m new file mode 100644 index 0000000..3c64d30 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Object/Object.m @@ -0,0 +1,18 @@ +classdef Object < handle +% OBJECT Root object for GCP.Bigquery +% +% Copyright 2020 The MathWorks, Inc. +% + +properties + Handle +end + +methods + %% Constructor + function obj = Object(~, varargin) + %fprintf("Creating root object"); + end +end + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@QueryJobConfiguration/QueryJobConfiguration.m b/Software/MATLAB/app/system/+gcp/+bigquery/@QueryJobConfiguration/QueryJobConfiguration.m new file mode 100644 index 0000000..a369aa7 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@QueryJobConfiguration/QueryJobConfiguration.m @@ -0,0 +1,82 @@ +classdef QueryJobConfiguration < gcp.bigquery.Object +% QUERYJOBCONFIGURATION Google BigQuery Query Job configuration. A Query Job runs a query against BigQuery data. +% +% Usage: +% +% 1. Use QueryJobConfiguration.Builder to build configuration for +% queries with custom options +% +% query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; +% queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(logical(1)); +% queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); +% queryJobConfiguration = queryJobConfigurationBuilder.build() +% +% 2. Use QueryJobConfiguration to set default configuration for queries +% +% query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; +% queryJobConfiguration = gcp.bigquery.QueryJobConfiguration.of(query); +% + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = QueryJobConfiguration(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify class of the input java class object before + % wrapping/assigning it as a Handle for MATLAB class object + % gcp.bigquery.QueryJobConfiguration + switch (class(varargin{1})) + case 'com.google.cloud.bigquery.QueryJobConfiguration' + obj.Handle = varargin{1}; + otherwise + write(logObj,'error','QueryJobConfiguration Object creation failed'); + end + end +end + +methods(Static) + + function QueryJobConfigurationBuilder = newBuilder(query) + % Imports + import com.google.cloud.bigquery.*; + + % Create QueryJobConfiguration.Builder + QueryJobConfigurationBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.QueryJobConfiguration',query); + + % Wrap into a MATLAB class object + QueryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.Builder(QueryJobConfigurationBuilderJ); + end + + function QueryJobConfiguration = of(query) + % Imports + import com.google.cloud.bigquery.*;%QueryJobConfiguration; + + % Create default QueryJobConfiguration + QueryJobConfigurationJ = javaMethod('of','com.google.cloud.bigquery.QueryJobConfiguration',query); + + % Wrap into a MATLAB class object + QueryJobConfiguration = gcp.bigquery.QueryJobConfiguration(QueryJobConfigurationJ); + end +end + +end %class + +% Reference : https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/QueryJobConfiguration.html +% +% Java API: +% --------- +% static QueryJobConfiguration.Builder newBuilder(String query) +% Creates a builder for a BigQuery Query Job given the query to be run. +% +% static QueryJobConfiguration of(String query) +% Returns a BigQuery Copy Job for the given the query to be run. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@StandardTableDefinition/StandardTableDefinition.m b/Software/MATLAB/app/system/+gcp/+bigquery/@StandardTableDefinition/StandardTableDefinition.m new file mode 100644 index 0000000..71df9ed --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@StandardTableDefinition/StandardTableDefinition.m @@ -0,0 +1,83 @@ +classdef StandardTableDefinition < gcp.bigquery.Object +% STANDARDTABLEDEFINITION Creates Table Definition for creating tables +% without Schema +% +% Usage +% +% Example: Creating an empty table +% -------------------------------- +% +% % Create Table definition: +% StandardTableDefinitionBuilder = gcp.bigquery.StandardTableDefinition.newBuilder(); +% StandardTableDefinition = StandardTableDefinitionBuilder.build(); +% +% % Create TableId for a table and a given dataset +% tableId = gcp.bigquery.TableId.of("existing_dataset","new_gbq_tablename") +% +% % Create TableInfo: +% tableInfo = gcp.bigquery.TableInfo.of(tableId,StandardTableDefinition); +% +% % Create TableField and TableOption +% tableFields = gcp.bigquery.BigQuery.TableField.values +% tableOption = gcp.bigquery.BigQuery.TableOption.fields(tableFields) +% +% % Create a new and empty table +% gbqclient.create(tableInfo,tableOption) + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = StandardTableDefinition(varargin) + + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verifying object class before assigning the Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.StandardTableDefinition') + write(logObj,'error','StandardTableDefinition Object creation failed due to invalid class'); + else + % Assigning java class object + % 'com.google.cloud.bigquery.StandardTableDefinition' as a + % Handle for MATLAB object gcp.bigquery.StandardTableDefinition + obj.Handle = varargin{1}; + end + end +end + +methods (Static) + + % Creating Builder for StandardTableDefinition class object + function StandardTableDefinitionBuilder = newBuilder(varargin) + + if isequal(nargin,0) + % Expecting 0 input arguments for an empty table definition + + % Creating Builder object + StandardTableDefinitionBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.StandardTableDefinition'); + + % Wrapping Java class object StandardTableDefinitionBuilderJ + % into a MATLAB class object StandardTableDefinitionBuilder + % using constructor + StandardTableDefinitionBuilder = gcp.bigquery.StandardTableDefinition.Builder(StandardTableDefinitionBuilderJ); + else + warning('Incorrect number of input arguments. Currently newBuilder method accepts 0 arguments for building an empty table definition'); + end + end + + +end + +end %class + +% Reference : https://googleapis.dev/java/google-cloud-bigquery/latest/com/google/cloud/bigquery/StandardTableDefinition.html +% +% Supported Java APIs +% ------------------- +% static StandardTableDefinition.Builder newBuilder() +% Creates a builder for an StandardTableDefinition object. + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Table/Table.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/Table.m new file mode 100644 index 0000000..73ec71f --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/Table.m @@ -0,0 +1,29 @@ +classdef Table < gcp.bigquery.Object +% TABLE A Google BigQuery Table. + + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = Table(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(varargin{1},'com.google.cloud.bigquery.Table') + write(logObj,'error','Table Object creation failed'); + else + obj.Handle = varargin{1}; + write(logObj,'debug','Table Handle created'); + end + end + +end + + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Table/delete.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/delete.m new file mode 100644 index 0000000..02429d3 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/delete.m @@ -0,0 +1,28 @@ +function tf = delete(tableobj) +% DELETE Method - deletes current table +% +% tf = gbqtable.delete() + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Access Table Handle +tableJ = tableobj.Handle; + +% Delete table +tf = tableJ.delete(); + +if tf + fprintf("\nTable deleted successfully\n"); +else + fprintf("\nTable not deleted successfully\n"); +end +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Table/exists.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/exists.m new file mode 100644 index 0000000..4ef186a --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/exists.m @@ -0,0 +1,28 @@ +function tf = exists(tableobj, varargin) +% EXISTS Method - checks if current table exists +% +% tf = gbqtable.exists() + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Access Table Handle +tableJ = tableobj.Handle; + +% Check for table +tf = tableJ.exists(); + +if tf + fprintf("\nTable exists\n"); +else + fprintf("\nTable does not exist\n"); +end +end %function diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Table/extract.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/extract.m new file mode 100644 index 0000000..40edd02 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/extract.m @@ -0,0 +1,61 @@ +function extract(table, varargin) +% EXTRACT Method - Starts a BigQuery Job to extract the current table to the provided destination URI. Returns the started Job object. +% +% filename = "mydata.csv"; +% gcsbucketname = "my_bucket"; +% job = table.extract(filename, gcsbucketname); + +% (c) 2020 MathWorks, Inc. + +%% Implementation + +% Imports +import com.google.cloud.bigquery.*; + +% Set Logger +logObj = Logger.getLogger(); +logObj.MsgPrefix = 'GCP:GBQ'; + +% Access Table Handle +tableJ = table.Handle; + +% File format to be saved as blob on google bucket e.g. csv, NewLineJSON +filename = string(varargin{1}); +filesplits = strsplit(filename,"."); +extension = filesplits(end); +switch extension + case "csv" + format = 'CSV'; %CSV, NEWLINE_DELIMITED_JSON and AVRO + case "avro" + format = 'AVRO'; + case "json" + format = 'NEWLINE_DELIMITED_JSON'; + otherwise + write(logObj,'error',''); +end + +% url format: ['gs://',bucket,'/',file]) +bucketname = string(varargin{2}); + +% Bucket Url e.g. gs://bucketname-for-example +destinationUri = strcat("gs://",bucketname,"/",filename); + +% Create JobOption +jobFields = gcp.bigquery.BigQuery.JobField.values; +jobOption = gcp.bigquery.BigQuery.JobOption.fields(jobFields); +jobOptions = javaArray('com.google.cloud.bigquery.BigQuery$JobOption',1); +jobOptions(1) = jobOption.Handle; + +% Create job for extracting table to Google Cloud Storage bucket +job = gcp.bigquery.Job(tableJ.extract(format,destinationUri,jobOptions)); + +% Wait for Job to complete +job.waitFor + +end %function + +% Java API implemented above +% +% public Job extract(String format, +% String destinationUri, +% BigQuery.JobOption... options) \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@Table/load.m b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/load.m new file mode 100644 index 0000000..c01b5e9 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@Table/load.m @@ -0,0 +1,34 @@ +function job = load(gbqtable, varargin) +% LOAD Starts a BigQuery Job to load data into the current table from the provided source URIs. +% +% For instance, loading data from Google cloud storage bucket +% +% Input Arguments: +% * bigquery table +% * format of the source file (See FormatOptions for more details) +% * source Uri e.g. "gs://my_bucket/filename1.csv" +% * Job Option + +% (c) 2020 MathWorks, Inc. + +% Get the Handle to the Java object Table +gbqtableJ = gbqtable.Handle; + +% Getting Inut arguments formatOptions, sourceUri for source data and +% configuration for running the load job within jobOptions +formatOptions = varargin{1}.Handle; +sourceUri = varargin{2}; +jobOption = varargin{3}.Handle; + +% Creating an array for the job options +jobOptionArray = javaArray('com.google.cloud.bigquery.BigQuery$JobOption',1); +jobOptionArray(1) = jobOption; + +% Invoke the load job to load the table with the source data +jobJ = gbqtableJ.load(formatOptions,sourceUri,jobOptionArray); + +% Wrapping the job into a MATLAB object gcp.bigquery.Job and returning +job = gcp.bigquery.Job(jobJ); + +end %function + diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@TableId/TableId.m b/Software/MATLAB/app/system/+gcp/+bigquery/@TableId/TableId.m new file mode 100644 index 0000000..9055060 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@TableId/TableId.m @@ -0,0 +1,50 @@ +classdef TableId < gcp.bigquery.Object +% TABLEID Returns TableId for a BigQuery Table +% +% Usage +% +% tableId = gcp.bigquery.TableId.of("DatasetId","TableId") +% + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = TableId(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + switch (class(varargin{1})) + case 'com.google.cloud.bigquery.TableId' + obj.Handle = varargin{1}; + otherwise + write(logObj,'error','TableId Object creation failed'); + end + end + +end + +methods (Static) + % Creates a table identity given dataset's and table's user-defined ids + function tableId = of(destinationDataset,destinationTable) + % Create TableId + tableIdJ = javaMethod('of','com.google.cloud.bigquery.TableId',destinationDataset, destinationTable); + + % Wrapping java tableIdJ into a MATLAB object gcp.bigquery.TableId + tableId = gcp.bigquery.TableId(tableIdJ); + end +end + +end %class + +% Java API Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/TableId.html +% +% Supported Methods: +% +% static TableId of(String dataset, String table) +% Creates a table identity given dataset's and table's user-defined ids. \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@TableInfo/TableInfo.m b/Software/MATLAB/app/system/+gcp/+bigquery/@TableInfo/TableInfo.m new file mode 100644 index 0000000..641f89d --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@TableInfo/TableInfo.m @@ -0,0 +1,52 @@ +classdef TableInfo < gcp.bigquery.Object +% TABLEINFO Google BigQuery table information. +% +% Usage +% +% +% % Create Table definition: +% StandardTableDefinitionBuilder = gcp.bigquery.StandardTableDefinition.newBuilder(); +% StandardTableDefinition = StandardTableDefinitionBuilder.build(); +% +% % Create TableInfo +% tableInfo = of(tableId,StandardTableDefinitio) + +% (c) 2020 MathWorks, Inc. + + +properties +end + +methods + %% Constructor + function obj = TableInfo(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Validating class of the object before assigning it as Handle + if ~ isa(varargin{1},'com.google.cloud.bigquery.TableInfo') + write(logObj,'error','TableInfo Object creation failed'); + else + obj.Handle = varargin{1}; + end + + end +end + +methods (Static) + function tableInfo = of(tableId,TableDefinition) + + import com.google.cloud.bigquery.*; + + % Create TableInfo with tnput arguments such as TableId and the + % TableDefinition + tableInfoJ = javaMethod('of','com.google.cloud.bigquery.TableInfo',tableId.Handle,TableDefinition.Handle); + + % Wraps Java object tableInfoJ into a MATLAB class object TableInfo + % using the constructor + tableInfo = gcp.bigquery.TableInfo(tableInfoJ); + end +end + +end %class \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@TableResult/TableResult.m b/Software/MATLAB/app/system/+gcp/+bigquery/@TableResult/TableResult.m new file mode 100644 index 0000000..1bf9220 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@TableResult/TableResult.m @@ -0,0 +1,48 @@ +classdef TableResult < gcp.bigquery.Object +% TABLERESULT Returns query results from BigQuery as a TableResult object +% See function `gbq2table` for converting TableResult to a MATLAB table +% +% This class is used as a holder for bigquery.query() and job.getQueryResults() methods return object +% +% Usage +% +% tableResult = gbq.query(queryJobConfiguration) +% +% tableResult = job.getQueryResults(queryResultsOption) + +% (c) 2020 MathWorks, Inc. + + + +properties +end + +methods + %% Constructor + function obj = TableResult(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + if ~ isa(varargin{1},'com.google.cloud.bigquery.TableResult') + write(logObj,'error','TableResult Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +end %class + +% Class Methods +% +% boolean equals(Object obj) +% TableResult getNextPage() +% String getNextPageToken() +% Schema getSchema() +% long getTotalRows() +% Iterable getValues() +% int hashCode() +% boolean hasNextPage() +% Iterable iterateAll() +% String toString() \ No newline at end of file diff --git a/Software/MATLAB/app/system/+gcp/+bigquery/@WriteChannelConfiguration/WriteChannelConfiguration.m b/Software/MATLAB/app/system/+gcp/+bigquery/@WriteChannelConfiguration/WriteChannelConfiguration.m new file mode 100644 index 0000000..59c3eb8 --- /dev/null +++ b/Software/MATLAB/app/system/+gcp/+bigquery/@WriteChannelConfiguration/WriteChannelConfiguration.m @@ -0,0 +1,160 @@ +classdef WriteChannelConfiguration < gcp.bigquery.Object +% WRITECHANNELCONFIGURATION Google BigQuery Configuration for a load operation. +% +% A load configuration can be used to load data into a table with a WriteChannel (BigQuery.writer(WriteChannelConfiguration)). +% This class is in implicit usage within the function "copyfiletobigquery" +% +% Usage +% +% % Set configurations such as formatOption and detection of format overwriting permissions +% % and others while loading data from any source to a bigquery table +% +% writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setFormatOptions(formatOptions); +% writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); +% +% % Settings for creating a table if none exist and overwriting/appending to a table if it already exists +% +% createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createdisposition); +% writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writedisposition); +% +% % Assign the above settings of create and write disposition to the writeChannelCongfigurationBuilder +% +% writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setCreateDisposition(createDispositionConfig); +% writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setWriteDisposition(writeDispositionConfig); +% +% % Build the above config +% +% writeChannelConfiguration = writeChannelConfigurationBuilder.build; +% +% % Create a writer object using the above configuration +% +% writer = gbq.Handle.writer(writeChannelConfiguration.Handle); +% +% % Create channel stream for writer to write in +% +% import java.nio.channels.Channels +% stream = Channels.newOutputStream(writer); +% +% % Get file path to the local source +% +% import java.nio.file.FileSystems +% path = which(filename); +% splits = strsplit(path,filesep); +% fileartifact = splits{end}; +% pathartifact = fullfile(splits{1:end-1}); +% javafilepath = FileSystems.getDefault().getPath(pathartifact,fileartifact); +% +% % Run file copy job +% import java.nio.file.Files +% Files.copy(javafilepath, stream); +% +% % Close writer +% writer.close +% +% % Get Job handle for the bigquery copy job +% job = writer.getJob(); + +% (c) 2020 MathWorks, Inc. + +properties +end + +methods + %% Constructor + function obj = WriteChannelConfiguration(varargin) + % Setting up Logger for this class + logObj = Logger.getLogger(); + logObj.MsgPrefix = 'GCP:GBQ'; + + % Verify class of the object + if ~ isa(varargin{1},'com.google.cloud.bigquery.WriteChannelConfiguration') + write(logObj,'error','WriteChannelConfiguration Object creation failed'); + else + obj.Handle = varargin{1}; + end + end +end + +methods (Static) + + %Creates a builder for a BigQuery Load Configuration given the destination table and(or) format. + function WriteChannelConfigurationBuilder = newBuilder(varargin) + if isequal(nargin,1) + + tableId = varargin{1}.Handle; + + % Creates a builder for a BigQuery Load Configuration given the destination table. + WriteChannelConfigurationBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.WriteChannelConfiguration',tableId); + + % Wraps Java object into a MATLAB object using the constructor + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + + elseif isequal(nargin,2) + + tableId = varargin{1}.Handle; + formatOptions = varargin{2}.Handle; + + % Creates a builder for a BigQuery Load Configuration given the + % destination table using inputs such as tableId and + % formatOptions object created from the source file format + WriteChannelConfigurationBuilderJ = javaMethod('newBuilder','com.google.cloud.bigquery.WriteChannelConfiguration',tableId,formatOptions); + + % Wrap Java object into a MATLAB class object with the + % constructor + WriteChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.Builder(WriteChannelConfigurationBuilderJ); + else + % Expected input arguments to be either 1 or 2 + warning('Incorrect number of input arguments'); + end + + end + + %Returns a BigQuery Load Configuration for the given destination table and(or) format. + function WriteChannelConfiguration = of(varargin) + if isequal(nargin,1) + + tableId = varargin{1}.Handle; + + % Returns a BigQuery Load Configuration for the given destination table. + WriteChannelConfigurationJ = javaMethod('of','com.google.cloud.bigquery.WriteChannelConfiguration',tableId); + + % Wrap Java object into a MATLAB class object with the + % constructor + WriteChannelConfiguration = gcp.bigquery.WriteChannelConfiguration(WriteChannelConfigurationJ); + + elseif isequal(nargin,2) + + tableId = varargin{1}.Handle; + formatOptions = varargin{2}.Handle; + + % Returns a BigQuery Load Configuration for the given + % destination table and source file format + WriteChannelConfigurationJ = javaMethod('of','com.google.cloud.bigquery.WriteChannelConfiguration',tableId,formatOptions); + + % Wrap Java object into a MATLAB class object with the + % constructor + WriteChannelConfiguration = gcp.bigquery.WriteChannelConfiguration(WriteChannelConfigurationJ); + else + % Expected input arguments to be either 1 or 2 + warning('Incorrect number of input arguments'); + end + end +end + +end %class + +% Reference: https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/WriteChannelConfiguration.html +% +% Supported Java Methods +% ---------------------- +% static WriteChannelConfiguration.Builder newBuilder(TableId destinationTable) +% Creates a builder for a BigQuery Load Configuration given the destination table. +% +% static WriteChannelConfiguration.Builder newBuilder(TableId destinationTable, FormatOptions format) +% Creates a builder for a BigQuery Load Configuration given the destination table and format. +% +% static WriteChannelConfiguration of(TableId destinationTable) +% Returns a BigQuery Load Configuration for the given destination table. +% +% static WriteChannelConfiguration of(TableId destinationTable, FormatOptions format) +% Returns a BigQuery Load Configuration for the given destination table and format. \ No newline at end of file diff --git a/Software/MATLAB/config/credentials.json.template b/Software/MATLAB/config/credentials.json.template new file mode 100644 index 0000000..01e3624 --- /dev/null +++ b/Software/MATLAB/config/credentials.json.template @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "[REDACTED]", + "private_key_id": "1378f[REDACTED]0eb2", + "private_key": "-----BEGIN PRIVATE KEY-----\nMI[REDACTED]v2fE=\n-----END PRIVATE KEY-----\n", + "client_email": "46[REDACTED]89-compute@developer.gserviceaccount.com", + "client_id": "1157[REDACTED]7232", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/46[REDACTED]89-compute%40developer.gserviceaccount.com" +} + diff --git a/Software/MATLAB/script/Examples/GettingStartednewls.mlx b/Software/MATLAB/script/Examples/GettingStartednewls.mlx new file mode 100644 index 0000000..04470bd Binary files /dev/null and b/Software/MATLAB/script/Examples/GettingStartednewls.mlx differ diff --git a/Software/MATLAB/script/Examples/airlinesmall.csv b/Software/MATLAB/script/Examples/airlinesmall.csv new file mode 100644 index 0000000..36f6365 --- /dev/null +++ b/Software/MATLAB/script/Examples/airlinesmall.csv @@ -0,0 +1,1339 @@ +Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay,DepDelay,Origin,Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted +1996,1,18,4,2117,2120,2305,2259,HP,415,N637AW,108,99,85,6,-3,COS,PHX,551,5,18,0,,0 +1996,1,12,5,1252,1245,1511,1500,HP,610,N905AW,79,75,58,11,7,LAX,PHX,370,3,18,0,,0 +1996,1,16,2,1441,1445,1708,1721,HP,211,N165AW,87,96,74,-13,-4,RNO,PHX,601,4,9,0,,0 +1996,1,1,1,2258,2300,2336,2335,HP,1245,N183AW,38,35,20,1,-2,TUS,PHX,110,6,12,0,,0 +1996,1,4,4,1814,1814,1901,1910,US,683,N963VJ,47,56,34,-9,0,DTW,PIT,201,6,7,0,,0 +1996,1,31,3,1822,1820,1934,1925,US,757,N912VJ,72,65,52,9,2,PHL,PIT,267,6,14,0,,0 +1996,1,18,4,729,730,841,843,US,1564,N941VJ,72,73,58,-2,-1,DCA,PVD,357,3,11,0,,0 +1996,1,26,5,1704,1705,1829,1839,NW,1538,N960N,85,94,69,-10,-1,DTW,RIC,456,3,13,0,,0 +1996,1,11,4,1858,1850,1959,1956,US,2225,N351US,61,66,48,3,8,PHL,ROC,257,2,11,0,,0 +1996,1,7,7,2100,2100,2215,2220,WN,174,N677,75,80,65,-5,0,OAK,SAN,446,3,7,0,,0 +1996,1,16,2,1715,1715,1805,1810,WN,167,N20,50,55,41,-5,0,DAL,SAT,248,2,7,0,,0 +1996,1,30,2,1205,1210,1312,1322,CO,1127,N10236,67,72,52,-10,-5,CLE,SDF,304,4,11,0,,0 +1996,1,8,1,1232,1232,1520,1517,AS,62,N755AS,108,105,94,3,0,KTN,SEA,680,5,9,0,,0 +1996,1,30,2,1558,1600,1744,1757,UA,2410,N310UA,106,117,92,-13,-2,SFO,SEA,679,3,11,0,,0 +1996,1,14,7,2331,2325,616,605,UA,132,N4714U,285,280,263,11,6,HNL,SFO,2398,5,17,0,,0 +1996,1,7,7,1513,0,1738,0,AA,83,N339AA,265,268,246,10,13,ORD,SFO,1846,2,17,0,,0 +1996,1,27,6,711,710,814,802,UA,1053,N360UA,123,112,100,12,1,SLC,SFO,599,6,17,0,,0 +1996,1,12,5,635,635,846,840,WN,648,N357,131,125,113,6,0,SEA,SJC,697,2,16,0,,0 +1996,1,29,1,1544,0,1732,0,AA,1267,N822AA,168,158,148,12,2,DFW,SLC,988,5,15,0,,0 +1996,1,12,5,1308,1300,1539,1530,DL,1908,N302WA,91,90,74,9,8,PSP,SLC,541,7,10,0,,0 +1996,1,16,2,1207,1207,1355,1346,AS,84,N760AS,108,99,92,9,0,SEA,SMF,605,5,11,0,,0 +1996,1,2,2,914,840,1105,1005,DL,1537,N620DL,111,85,67,60,34,ATL,SRQ,445,3,41,0,,0 +1996,1,11,4,1121,0,1326,0,AA,426,N2CFAA,125,102,94,64,41,DFW,STL,551,6,25,0,,0 +1996,1,10,3,1629,1625,1743,1735,WN,492,N20,74,70,61,8,4,LIT,STL,296,2,11,0,,0 +1996,1,1,1,1240,1220,1345,1335,TW,675,N928L,65,75,48,10,20,ORD,STL,258,7,10,0,,0 +1996,1,24,3,2149,2150,2241,2247,NW,1241,N965N,52,57,40,-6,-1,MSP,SUX,234,4,8,0,,0 +1996,1,20,6,910,900,1102,1041,CO,1069,N44214,112,101,88,21,10,GSO,TPA,580,3,21,0,,0 +1996,1,3,3,1436,0,1552,0,AA,1997,N427AA,136,140,114,16,20,DFW,TUS,813,5,17,0,,0 +1996,1,29,1,1825,1825,1943,1945,WN,230,N667,78,80,60,-2,0,SMF,LAX,373,7,11,0,,0 +1996,1,15,1,1242,1230,1332,1321,DL,1752,N413DA,50,51,35,11,12,DCA,LGA,214,4,11,0,,0 +1996,1,2,2,1152,1100,1434,1355,UA,688,N422UA,102,115,87,39,52,ORD,LGA,733,5,10,0,,0 +1996,1,16,2,,2000,,2125,CO,1071,UNKNOW,,85,,,,IAH,MAF,429,0,0,1,,0 +1996,1,10,3,1528,1440,2058,2000,US,411,N391US,210,200,191,58,48,SFO,MCI,1499,6,13,0,,0 +1996,1,1,1,1103,1105,1333,1313,US,2002,N288AU,150,128,132,20,-2,IAD,MCO,758,9,9,0,,0 +1996,1,10,3,1515,1520,1533,1530,CO,1507,N14209,78,70,55,3,-5,CLE,MDW,307,8,15,0,,0 +1996,1,11,4,701,700,755,757,NW,854,N949N,54,57,42,-2,1,B,MEM,200,3,9,0,,0 +1996,1,17,3,1154,1155,1254,1302,CO,1675,N16617,60,67,47,-8,-1,IAH,MFE,316,3,10,0,,0 +1996,1,2,2,2107,1625,132,1928,TW,189,N54353,265,183,173,364,282,JFK,MIA,1090,7,85,0,,0 +1996,1,28,7,1213,1210,1330,1335,DL,929,N959DL,77,85,58,-5,3,ATL,MLB,443,5,14,0,,0 +1996,1,5,5,842,835,1121,1125,UA,204,N994UA,99,110,86,-4,7,DEN,MSP,680,3,10,0,,0 +1996,1,3,3,1452,1455,1608,1614,NW,557,N293US,76,79,60,-6,-3,MDW,MSP,349,4,12,0,,0 +1996,1,10,3,1521,1525,2051,2048,NW,156,N514US,210,203,194,3,-4,SEA,MSP,1399,4,12,0,,0 +1996,1,11,4,2309,2310,6,6,CO,1916,N14308,57,56,43,0,-1,IAH,MSY,305,5,9,0,,0 +1996,1,20,6,1156,1145,1306,1255,WN,517,N327,70,70,62,11,11,ONT,OAK,361,2,6,0,,0 +1996,1,28,7,,1415,,1542,NW,795,N925US,,87,,,,MEM,OKC,432,0,0,1,,0 +1996,1,23,2,1850,1850,1855,1855,WN,394,N528,65,65,56,0,0,PHX,ONT,325,1,8,0,,0 +1996,1,4,4,,0,,0,AA,1581,UNKNOW,,,,,,BOS,ORD,867,0,0,1,,0 +1996,1,8,1,1045,1040,1349,1358,UA,756,N1815U,124,138,105,-9,5,DEN,ORD,888,4,15,0,,0 +1996,1,28,7,2107,2110,2318,2327,CO,162,N73385,131,137,114,-9,-3,IAH,ORD,925,7,10,0,,0 +1996,1,15,1,1911,1905,2047,2045,UA,1259,N7269U,156,160,139,2,6,MCO,ORD,1005,5,12,0,,0 +1996,1,7,7,,1320,,1433,UA,773,UNKNOW,,133,,,,PHL,ORD,678,0,0,1,,0 +1996,1,5,5,916,915,1513,1512,UA,678,N7445U,237,237,213,1,1,SJC,ORD,1829,7,17,0,,0 +1996,1,11,4,1737,1733,1915,1915,DL,1819,N111DN,98,102,76,0,4,ATL,PBI,545,4,18,0,,0 +1996,1,23,2,1555,1555,1734,1725,WN,1705,N358,99,90,86,9,0,OAK,PDX,543,3,10,0,,0 +1996,1,28,7,2149,2145,2310,2312,US,489,N617AU,81,87,61,-2,4,CLT,PHL,448,8,12,0,,0 +1996,1,11,4,835,830,1516,1452,US,164,N516AU,281,262,260,24,5,PHX,PHL,2075,3,18,0,,0 +1996,1,28,7,1152,1150,1308,1300,DL,161,N912DL,136,130,118,8,2,ATL,DFW,732,5,13,0,,0 +1996,1,10,3,856,0,1147,0,AA,1472,N455AA,111,126,84,-14,1,DEN,DFW,641,10,17,0,,0 +1996,1,29,1,1750,0,2206,0,AA,884,N470AA,136,150,121,-14,0,LAS,DFW,1055,6,9,0,,0 +1996,1,6,6,831,0,1002,0,AA,1593,N407AA,91,98,73,-9,-2,MSY,DFW,448,9,9,0,,0 +1996,1,31,3,850,0,1334,0,AA,2002,N446AA,164,175,136,-11,0,SAN,DFW,1171,15,13,0,,0 +1996,1,19,5,250,0,534,0,AA,2361,N460AA,104,111,91,-12,-5,TUS,DFW,813,4,9,0,,0 +1996,1,5,5,1535,1530,2006,2006,UA,328,N537UA,151,156,129,0,5,DEN,DTW,1123,6,16,0,,0 +1996,1,11,4,2034,1935,2240,2140,NW,1410,N89S,66,65,38,60,59,MDW,DTW,229,17,11,0,,0 +1996,1,1,1,2019,2020,2143,2143,NW,1501,N8957E,84,83,62,0,-1,ROC,DTW,296,5,17,0,,0 +1996,1,31,3,1542,1544,1643,1648,HP,428,N141AW,61,64,50,-5,-2,PHX,ELP,347,3,8,0,,0 +1996,1,28,7,809,0,1209,0,AA,1058,N274AA,180,201,158,-19,2,DFW,EWR,1372,7,15,0,,0 +1996,1,9,2,1750,1730,2117,2031,UA,658,N7260U,147,121,122,46,20,ORD,EWR,719,6,19,0,,0 +1996,1,15,1,1529,1515,2110,2102,UA,1590,N332UA,221,227,198,8,14,DEN,FLL,1703,3,20,0,,0 +1996,1,15,1,1716,1710,1815,1815,DL,1961,N326DL,59,65,46,0,6,ATL,GNV,300,3,10,0,,0 +1996,1,31,3,1830,1830,2013,2010,US,835,N973VJ,103,100,89,3,0,PHL,GSP,514,5,9,0,,0 +1996,1,22,1,1515,1515,1608,1610,WN,42,N53,53,55,43,-2,0,HRL,HOU,276,4,6,0,,0 +1996,1,27,6,1334,1333,1523,1530,DL,1232,N989DL,109,117,66,-7,1,ATL,IAD,533,5,38,0,,0 +1996,1,30,2,1147,1150,1336,1348,CO,1101,N12514,109,118,95,-12,-3,B,IAH,657,4,10,0,,0 +1996,1,6,6,130,125,627,623,CO,1856,N15820,177,178,159,4,5,LAX,IAH,1379,4,14,0,,0 +1996,1,29,1,1845,1805,2009,1925,CO,1767,N12327,144,140,124,44,40,SDF,IAH,788,6,14,0,,0 +1996,1,26,5,1315,1315,1556,1551,NW,1266,N728RW,101,96,73,5,0,MSP,IND,503,7,21,0,,0 +1996,1,29,1,1309,1305,1745,1725,DL,1980,N171DN,216,200,164,20,4,DFW,JFK,1391,25,27,0,,0 +1996,1,22,1,2211,2215,2329,2328,HP,739,N901AW,258,253,246,1,-4,ATL,LAS,1747,3,9,0,,0 +1996,1,2,2,931,925,1014,1046,NW,719,N533US,163,201,148,-32,6,MSP,LAS,1300,4,11,0,,0 +1996,1,27,6,2109,2100,2218,2219,UA,2196,N942UA,69,79,53,-1,9,SFO,LAS,414,4,12,0,,0 +1996,1,26,5,1100,1100,1406,1355,CO,239,N57111,366,355,340,11,0,EWR,LAX,2454,7,19,0,,0 +1996,1,17,3,2127,2005,2325,2208,NW,309,N635US,238,243,200,77,82,MSP,LAX,1536,7,31,0,,0 +1996,1,9,2,1330,1330,1345,1350,WN,1042,N333,75,80,59,-5,0,PHX,LAX,370,5,11,0,,0 +1996,1,19,5,1605,1605,1710,1705,WN,970,N337,125,120,115,5,0,HOU,ABQ,759,2,8,0,,0 +1996,1,4,4,1155,1155,1251,1252,AS,144,N745AS,56,57,40,-1,0,FAI,ANC,261,4,12,0,,0 +1996,1,29,1,600,600,751,740,DL,1419,N918DE,111,100,96,11,0,CLE,ATL,554,7,8,0,,0 +1996,1,10,3,732,645,932,904,DL,1643,N126DL,120,139,99,28,47,EWR,ATL,745,7,14,0,,0 +1996,1,18,4,1459,1005,1927,1249,DL,471,N998DL,208,104,132,398,294,MCI,ATL,692,8,68,0,,0 +1996,1,30,2,1248,1245,1436,1421,DL,499,N406DA,108,96,90,15,3,PBI,ATL,545,6,12,0,,0 +1996,1,23,2,1442,1440,1631,1607,DL,1854,N613DL,109,87,92,24,2,SRQ,ATL,445,6,11,0,,0 +1996,1,13,6,1503,0,1743,0,AA,1185,N2AJAA,160,164,134,-6,-2,ORD,AUS,978,10,16,0,,0 +1996,1,30,2,1351,1336,1341,1325,DL,1817,N675DL,50,49,34,16,15,ATL,BHM,134,3,13,0,,0 +1996,1,20,6,1730,1730,1844,1900,WN,336,N303,74,90,63,-16,0,MCI,B,491,5,6,0,,0 +1996,1,29,1,1629,1630,1755,1756,US,1132,N896US,86,86,59,-1,-1,DCA,BOS,399,11,16,0,,0 +1996,1,10,3,2028,0,2353,0,AA,1198,N5BVAA,145,131,120,192,178,ORD,BOS,867,6,19,0,,0 +1996,1,31,3,2024,2020,2136,2134,US,838,N279AU,72,74,54,2,4,LGA,BUF,292,2,16,0,,0 +1996,1,19,5,1511,1500,1648,1630,US,470,N226US,97,90,78,18,11,BOS,BWI,370,6,13,0,,0 +1996,1,12,5,2311,2315,709,737,US,46,N510AU,298,322,282,-28,-4,SFO,BWI,2457,6,10,0,,0 +1996,1,27,6,1901,1855,2005,1950,DL,1078,N908DL,64,55,42,15,6,CVG,CLE,221,6,16,0,,0 +1996,1,23,2,1517,1517,1747,1750,TW,556,N54349,90,93,66,-3,0,STL,CLE,487,5,19,0,,0 +1996,1,20,6,1111,1110,1312,1302,US,2250,N376US,121,112,95,10,1,EWR,CLT,529,3,23,0,,0 +1996,1,11,4,1358,1350,1501,1458,US,2474,N929VJ,63,68,52,3,8,ORF,CLT,290,4,7,0,,0 +1996,1,9,2,1857,1755,2010,1912,US,927,N927VJ,73,77,55,58,62,DCA,CMH,322,4,14,0,,0 +1996,1,17,3,952,955,1055,1050,CO,1771,N15525,63,55,40,5,-3,IAH,CRP,201,5,18,0,,0 +1996,1,6,6,809,730,1038,1009,DL,1124,N917DE,149,159,125,29,39,MIA,CVG,948,4,20,0,,0 +1996,1,27,6,1055,1055,1321,1325,WN,296,N693,86,90,75,-4,0,ABQ,DAL,580,2,9,0,,0 +1996,1,3,3,2145,2055,2312,2217,DL,1620,N990DL,87,82,63,55,50,ATL,DAY,432,10,14,0,,0 +1996,1,16,2,1700,1700,1830,1814,CO,321,N17773,90,74,45,16,0,EWR,DCA,199,8,37,0,,0 +1996,1,25,4,1023,1010,1309,1312,TW,484,N9307R,106,122,89,-3,13,STL,DCA,719,2,15,0,,0 +1996,1,20,6,1133,1130,1310,1253,CO,1806,N16895,157,143,123,17,3,IAH,DEN,861,6,28,0,,0 +1996,1,29,1,1819,1820,2006,2002,HP,491,N186AW,107,102,85,4,-1,PHX,DEN,602,1,21,0,,0 +1996,2,26,1,,2000,,2111,HP,2636,N126AW,,71,,,,ELP,PHX,347,0,0,1,,0 +1996,2,19,1,919,920,1205,1134,NW,101,N533US,226,194,197,31,-1,MSP,PHX,1276,2,27,0,,0 +1996,2,27,2,1109,1110,1355,1353,HP,1288,N305AW,106,103,91,2,-1,SJC,PHX,621,5,10,0,,0 +1996,2,17,6,1903,1842,1943,1925,US,1457,N931VJ,40,43,29,18,21,CLE,PIT,105,6,5,0,,0 +1996,2,23,5,1043,1040,1319,1327,US,946,N881US,96,107,85,-8,3,MEM,PIT,652,5,6,0,,0 +1996,2,17,6,2057,2105,2151,2155,DL,1522,N909DA,54,50,30,-4,-8,MSY,PNS,186,4,20,0,,0 +1996,2,20,2,1020,1005,1315,1255,TW,582,N921L,115,110,93,20,15,STL,RDU,667,4,18,0,,0 +1996,2,11,7,2044,2030,2149,2140,NW,1500,N3312L,65,70,47,9,14,DTW,ROC,296,4,14,0,,0 +1996,2,2,5,2148,2000,2242,2055,WN,1111,N326,54,55,43,107,108,LAS,SAN,258,2,9,0,,0 +1996,2,13,2,747,740,835,835,WN,153,N512,48,55,39,0,7,DAL,SAT,248,2,7,0,,0 +1996,2,8,4,1253,1255,1336,1329,DL,703,N303DL,43,34,22,7,-2,CVG,SDF,83,4,17,0,,0 +1996,2,5,1,2130,2058,10,2328,AS,277,N976AS,160,150,140,42,32,LAX,SEA,954,5,15,0,,0 +1996,2,16,5,645,645,824,830,AS,409,N760AS,99,105,84,-6,0,SMF,SEA,605,5,10,0,,0 +1996,2,22,4,1456,1445,1834,1755,UA,901,N601UA,398,370,350,39,11,JFK,SFO,2586,5,43,0,,0 +1996,2,4,7,1125,935,1238,1043,HP,604,N149AW,133,128,120,115,110,PHX,SFO,651,4,9,0,,0 +1996,2,28,3,1454,1440,1630,1616,UA,1499,N339UA,156,156,142,14,14,DEN,SJC,948,4,10,0,,0 +1996,2,17,6,803,700,1120,1022,AA,476,N5BVAA,137,142,113,58,63,MIA,SJU,1045,3,21,0,,0 +1996,2,12,1,911,910,1046,1043,DL,1893,N907DA,155,153,137,3,1,MCI,SLC,919,7,11,0,,0 +1996,2,1,4,2119,1955,2242,2117,UA,1663,N7292U,143,142,128,85,84,DEN,SMF,910,4,11,0,,0 +1996,2,22,4,858,900,1134,1117,AA,1689,N5CYAA,276,257,255,17,-2,ORD,S,1726,4,17,0,,0 +1996,2,29,4,1959,1950,2054,2045,US,659,N968VJ,115,115,102,9,9,CLT,STL,575,3,10,0,,0 +1996,2,22,4,,800,,931,TW,46,UNKNOW,,91,,,,JAN,STL,444,0,0,1,,0 +1996,2,29,4,950,950,1100,1110,WN,528,N96,70,80,60,-10,0,OKC,STL,462,3,7,0,,0 +1996,2,15,4,1059,1100,1222,1217,TW,72,N54338,83,77,65,5,-1,TUL,STL,351,5,13,0,,0 +1996,2,2,5,1230,1225,,1515,CO,437,N16883,,170,,,5,EWR,TPA,998,0,30,0,,1 +1996,2,14,3,2130,2035,2313,2236,DL,1297,N477DA,223,241,207,37,55,CVG,TUS,1548,6,10,0,,0 +1996,2,19,1,731,730,756,753,DL,1975,N283WA,85,83,74,3,1,TUS,LAX,451,5,6,0,,0 +1996,2,3,6,1708,1615,2116,2027,AA,738,N215AA,188,192,150,49,53,DFW,LGA,1389,15,23,0,,0 +1996,2,27,2,718,720,822,830,US,271,N864US,64,70,51,-8,-2,RIC,LGA,292,4,9,0,,0 +1996,2,7,3,1546,1515,1807,1740,UA,704,N7265U,81,85,66,27,31,DEN,MCI,533,2,13,0,,0 +1996,2,23,5,1858,1850,2151,2150,DL,1665,N948DL,173,180,151,1,8,BOS,MCO,1121,5,17,0,,0 +1996,2,9,5,829,825,1041,1054,US,1043,N812US,132,149,119,-13,4,PHL,MCO,861,4,9,0,,0 +1996,2,8,4,1651,1640,1824,1808,NW,737,N677MC,93,88,61,16,11,MSP,MDW,349,5,27,0,,0 +1996,2,7,3,1432,1435,1614,1633,NW,676,N986US,102,118,88,-19,-3,MSP,MEM,700,5,9,0,,0 +1996,2,24,6,1054,1045,1425,1420,AA,1614,N722AA,151,155,127,5,9,DFW,MIA,1121,8,16,0,,0 +1996,2,13,2,1517,1520,1523,1528,NW,371,N324US,66,68,43,-5,-3,DTW,MKE,238,5,18,0,,0 +1996,2,10,6,657,700,751,758,NW,707,N202US,114,118,98,-7,-3,CMH,MSP,627,7,9,0,,0 +1996,2,25,7,1912,1825,2141,2029,NW,515,N322US,209,184,163,72,47,LGA,MSP,1020,6,40,0,,0 +1996,2,29,4,1301,1305,1349,1340,NW,1820,N942N,48,35,32,9,-4,RST,MSP,76,7,9,0,,0 +1996,2,16,5,1055,1100,1157,1200,CO,1908,N33506,62,60,43,-3,-5,IAH,MSY,305,4,15,0,,0 +1996,2,18,7,2100,2100,2219,2205,WN,1432,N319,79,65,65,14,0,ONT,OAK,361,2,12,0,,0 +1996,2,2,5,1403,1400,1542,1543,TW,337,N405EA,99,103,78,-1,3,STL,OKC,462,4,17,0,,0 +1996,2,6,2,1749,1539,1854,1652,UA,2321,N321UA,65,73,53,122,130,SFO,ONT,363,2,10,0,,0 +1996,2,7,3,2022,2025,2122,2126,UA,241,N582UA,120,121,104,-4,-3,BWI,ORD,622,5,11,0,,0 +1996,2,26,1,700,700,718,710,NW,161,N784NC,78,70,49,8,0,DTW,ORD,235,4,25,0,,0 +1996,2,16,5,650,635,1302,1231,AA,1492,N565AA,252,236,221,31,15,LAX,ORD,1745,7,24,0,,0 +1996,2,7,3,1401,1400,1507,1514,NW,134,N517US,66,74,48,-7,1,MSP,ORD,334,5,13,0,,0 +1996,2,27,2,1422,1355,1455,1434,UA,1847,N7455U,93,99,81,21,27,ROC,ORD,528,3,9,0,,0 +1996,2,4,7,1424,1344,1542,1515,DL,638,N996DL,78,91,62,27,40,ATL,ORF,516,5,11,0,,0 +1996,2,16,5,2202,2154,2356,2359,AA,1051,N540AA,234,245,222,-3,8,DFW,PDX,1616,3,9,0,,0 +1996,2,25,7,1839,1830,2019,2034,US,694,N934VJ,100,124,90,-15,9,ATL,PHL,665,2,8,0,,0 +1996,2,3,6,1544,1355,1815,1640,US,2720,N523AU,151,165,128,95,109,MIA,PHL,1013,7,16,0,,0 +1996,2,4,7,938,930,1049,1100,UA,1821,N387UA,131,150,114,-11,8,STL,DEN,770,7,10,0,,0 +1996,2,14,3,1520,1520,1751,1801,DL,1687,N937DL,91,101,73,-10,0,COS,DFW,592,9,9,0,,0 +1996,2,11,7,558,600,652,700,DL,859,N977DL,54,60,39,-8,-2,IAH,DFW,224,4,11,0,,0 +1996,2,8,4,1133,1115,1355,1344,NW,411,N676MC,142,149,114,11,18,MSP,DFW,852,5,23,0,,0 +1996,2,8,4,1359,1325,1848,1810,DL,1028,N902DA,169,165,153,38,34,SAN,DFW,1171,6,10,0,,0 +1996,2,7,3,1235,1235,1527,1507,UA,1828,N947UA,112,92,75,20,0,DEN,DSM,589,5,32,0,,0 +1996,2,26,1,658,700,855,854,CO,1459,N14239,117,114,86,1,-2,EWR,DTW,487,10,21,0,,0 +1996,2,20,2,803,800,1108,1109,NW,992,N336NW,185,189,169,-1,3,MIA,DTW,1145,5,11,0,,0 +1996,2,22,4,1847,1830,2114,2110,TW,280,N54350,87,100,62,4,17,STL,DTW,440,13,12,0,,0 +1996,2,1,4,,2120,,2327,DL,542,N607DL,,127,,,,ATL,EWR,745,0,0,1,,0 +1996,2,3,6,2354,2355,725,730,CO,1642,N58101,271,275,250,-5,-1,LAS,EWR,2227,7,14,0,,0 +1996,2,4,7,1546,1515,1924,1842,TW,32,N950U,158,147,135,42,31,STL,EWR,872,11,12,0,,0 +1996,2,23,5,1135,1120,1229,1215,WN,319,N379,54,55,37,14,15,TPA,FLL,197,3,14,0,,0 +1996,2,13,2,1244,1245,1409,1418,CO,1135,N17317,85,93,65,-9,-1,EWR,GSO,446,4,16,0,,0 +1996,2,27,2,1835,1835,2038,2035,WN,1535,N86,123,120,113,3,0,B,HOU,670,5,5,0,,0 +1996,2,5,1,1703,1705,2001,2011,UA,1482,N912UA,118,126,93,-10,-2,ORD,HPN,738,3,22,0,,0 +1996,2,15,4,1340,1340,1634,1630,CO,1669,N59630,114,110,93,4,0,ABQ,IAH,744,6,15,0,,0 +1996,2,10,6,711,710,853,855,CO,1857,N33608,162,165,147,-2,1,FLL,IAH,965,6,9,0,,0 +1996,2,10,6,713,715,1208,1210,CO,178,N10801,175,175,159,-2,-2,SAN,IAH,1303,4,12,0,,0 +1996,2,8,4,2116,1955,2339,2209,NW,945,N9338,83,74,61,90,81,MEM,IND,381,6,16,0,,0 +1996,2,12,1,1404,1355,1554,1536,TW,766,N52311,110,101,78,18,9,DTW,JFK,508,4,28,0,,0 +1996,2,11,7,1512,1450,1603,1545,WN,610,N366,51,55,38,18,22,BUR,LAS,223,4,9,0,,0 +1996,2,3,6,1600,1600,1646,1650,WN,852,N696,46,50,36,-4,0,ONT,LAS,197,2,8,0,,0 +1996,2,16,5,1340,1330,1442,1445,WN,1643,N513,62,75,55,-3,10,SMF,LAS,397,2,5,0,,0 +1996,2,13,2,1846,1845,2048,2025,CO,738,N18835,242,220,204,23,1,IAH,LAX,1379,15,23,0,,0 +1996,2,27,2,1704,1700,1842,1810,WN,1718,N615,98,70,81,32,4,OAK,LAX,337,7,10,0,,0 +1996,2,18,7,800,800,916,913,DL,1031,N401DA,76,73,50,3,0,SFO,LAX,337,5,21,0,,0 +1996,2,20,2,930,930,1028,1030,WN,801,N310,58,60,40,-2,0,PHX,ABQ,328,3,15,0,,0 +1996,2,17,6,924,925,1229,1220,DL,662,N499DA,125,115,98,9,-1,AUS,ATL,813,16,11,0,,0 +1996,2,2,5,1413,1255,1909,1735,DL,1108,N606DL,176,160,159,94,78,DEN,ATL,1199,8,9,0,,0 +1996,2,2,5,823,800,1125,1057,DL,652,N321DL,122,117,102,28,23,ICT,ATL,781,7,13,0,,0 +1996,2,21,3,1223,1115,1528,1431,DL,1249,N905DL,125,136,111,57,68,MSP,ATL,906,3,11,0,,0 +1996,2,22,4,734,735,1050,1041,DL,1710,N906DL,136,126,118,9,-1,SAT,ATL,874,11,7,0,,0 +1996,2,10,6,1914,1905,2126,2120,WN,506,N607,72,75,64,6,9,ELP,AUS,528,4,4,0,,0 +1996,2,18,7,2138,2130,2255,2249,US,1490,N775AU,77,79,53,6,8,PIT,BDL,406,6,18,0,,0 +1996,2,29,4,850,850,1049,1022,CO,1035,N77215,179,152,132,27,0,EWR,B,748,7,40,0,,0 +1996,2,29,4,2235,2235,16,15,DL,1778,N134DL,101,100,84,1,0,CVG,BOS,752,5,12,0,,0 +1996,2,18,7,1631,1630,1938,1946,AA,1278,N597AA,127,136,103,-8,1,ORD,BOS,867,9,15,0,,0 +1996,2,23,5,,1325,,1552,UA,540,UNKNOW,,87,,,,ORD,BUF,473,0,0,1,,0 +1996,2,16,5,,1520,,1633,US,898,UNKNOW,,73,,,,CLT,BWI,361,0,0,1,,0 +1996,2,10,6,1006,1007,1053,1055,DL,2009,N947DL,47,48,32,-2,-1,ATL,CAE,191,3,12,0,,0 +1996,2,26,1,1550,1550,1916,1923,CO,1994,N33817,146,153,121,-7,0,IAH,CLE,1091,15,10,0,,0 +1996,2,22,4,610,600,811,810,US,1071,N413US,121,130,105,1,10,BOS,CLT,728,4,12,0,,0 +1996,2,28,3,644,643,802,755,US,541,N574US,78,72,61,7,1,JAX,CLT,329,6,11,0,,0 +1996,2,28,3,853,855,1011,1008,US,487,N970VJ,78,73,54,3,-2,SDF,CLT,336,15,9,0,,0 +1996,2,21,3,2224,2055,41,2310,WN,321,N522,77,75,64,91,89,STL,CMH,410,3,10,0,,0 +1996,2,23,5,1105,1055,1208,1158,DL,715,N924DL,63,63,48,10,10,GRR,CVG,268,4,11,0,,0 +1996,2,1,4,1410,1410,1931,1922,DL,826,N614DL,201,192,154,9,0,SLC,CVG,1449,26,21,0,,0 +1996,2,14,3,1153,1145,1230,1230,WN,324,N130,37,45,29,0,8,OKC,DAL,181,2,6,0,,0 +1996,2,7,3,1257,1256,1648,1643,DL,678,N908DA,171,167,147,5,1,DFW,DCA,1192,11,13,0,,0 +1996,2,20,2,,1524,,1828,TW,30,N54334,,124,,,,STL,DCA,719,0,0,1,,0 +1996,2,27,2,733,735,851,859,CO,667,N16301,138,144,119,-8,-2,IAH,DEN,861,5,14,0,,0 +1996,2,23,5,1310,1310,1443,1455,HP,494,N634AW,93,105,76,-12,0,PHX,DEN,602,3,14,0,,0 +1996,3,10,7,835,830,1017,1023,UA,1063,N395UA,102,113,88,-6,5,DEN,PHX,602,4,10,0,,0 +1996,3,2,6,2135,2130,2331,2335,WN,252,N81,56,65,50,-4,5,LAX,PHX,370,2,4,0,,0 +1996,3,23,6,2305,2305,101,105,TW,462,N956U,56,60,45,-4,0,SAN,PHX,304,2,9,0,,0 +1996,3,16,6,1008,1004,1145,1135,DL,312,N294WA,97,91,69,10,4,ATL,PIT,526,6,22,0,,0 +1996,3,19,2,141,1920,244,2049,US,1881,N271AU,63,89,48,355,381,EWR,PIT,319,5,10,0,,0 +1996,3,29,5,,955,,1109,US,1488,UNKNOW,,74,,,,RIC,PIT,259,0,0,1,,0 +1996,3,4,1,1158,1150,1318,1314,US,870,N864US,80,84,68,4,8,PIT,PVD,467,4,8,0,,0 +1996,3,6,3,1420,1420,1418,1440,WN,863,N320,58,80,49,-22,0,BOI,RNO,335,2,7,0,,0 +1996,3,12,2,1352,1353,1520,1525,DL,205,N631DL,88,92,70,-5,-1,ATL,RSW,515,4,14,0,,0 +1996,3,18,1,900,900,1013,1020,WN,1700,N617,73,80,66,-7,0,OAK,SAN,446,2,5,0,,0 +1996,3,30,6,929,920,1031,1026,AA,1918,N285AA,62,66,46,5,9,DFW,SAT,247,7,9,0,,0 +1996,3,17,7,1850,1845,2036,2026,US,429,N985VJ,106,101,83,10,5,DCA,SDF,474,6,17,0,,0 +1996,3,12,2,1829,1833,2110,2106,AS,193,N772AS,161,153,146,4,-4,LAX,SEA,954,4,11,0,,0 +1996,3,8,5,1450,1450,1542,1545,DL,1473,N483DA,112,115,90,-3,0,SLC,SEA,689,3,19,0,,0 +1996,3,18,1,1157,1200,1424,1407,CO,231,N98876,267,247,241,17,-3,IAH,SFO,1635,6,20,0,,0 +1996,3,3,7,1220,1215,1516,1449,UA,691,N588UA,296,274,277,27,5,ORD,SFO,1846,4,15,0,,0 +1996,3,19,2,1125,1125,1328,1350,TW,177,N9407R,243,265,228,-22,0,STL,SFO,1736,4,11,0,,0 +1996,3,13,3,1720,1720,1830,1835,WN,761,N688,70,75,59,-5,0,S,SJC,342,2,9,0,,0 +1996,3,3,7,,845,,1037,DL,1945,N307WA,,172,,,,DFW,SLC,988,0,0,1,,0 +1996,3,30,6,1400,1400,1610,1615,WN,1775,N505,70,75,58,-5,0,RNO,SLC,422,2,10,0,,0 +1996,3,5,2,1542,1515,1713,1655,WN,1728,N693,91,100,76,18,27,SEA,SMF,605,2,13,0,,0 +1996,3,25,1,915,905,1130,1110,DL,1167,N989DL,135,125,113,20,10,CVG,SRQ,812,3,19,0,,0 +1996,3,8,5,1715,1718,1918,1912,AA,1854,N2CVAA,123,114,90,6,-3,DFW,STL,551,6,27,0,,0 +1996,3,9,6,1630,1630,1733,1743,TW,584,N491SA,63,73,57,-10,0,LNK,STL,370,4,2,0,,0 +1996,3,21,4,825,744,928,855,UA,1637,N338UA,63,71,45,33,41,ORD,STL,258,5,13,0,,0 +1996,3,9,6,1901,1830,2046,2012,US,834,N919VJ,105,102,81,34,31,CLT,SWF,571,6,18,0,,0 +1996,3,3,7,1855,1855,1950,1950,WN,1867,N95,55,55,39,0,0,FLL,TPA,197,5,11,0,,0 +1996,3,7,4,1949,1945,2127,2132,UA,589,N7293U,98,107,83,-5,4,DEN,TUS,639,4,11,0,,0 +1996,3,9,6,640,640,725,730,WN,1745,N387,105,110,87,-5,0,SLC,LAX,590,7,11,0,,0 +1996,3,28,4,1105,1100,1242,1239,DL,712,N499DA,97,99,75,3,5,CVG,LGA,585,9,13,0,,0 +1996,3,4,1,601,600,843,900,AA,398,N407AA,102,120,87,-17,1,ORD,LGA,733,4,11,0,,0 +1996,3,16,6,1150,1150,1257,1255,WN,71,N332,67,65,55,2,0,DAL,MAF,319,2,10,0,,0 +1996,3,2,6,1003,1000,1327,1325,WN,456,N521,144,145,130,2,3,PHX,MCI,1044,2,12,0,,0 +1996,3,12,2,742,740,1005,1014,DL,305,N990DL,143,154,128,-9,2,EWR,MCO,938,4,11,0,,0 +1996,3,13,3,1515,1515,1633,1630,WN,1263,N662,78,75,63,3,0,B,MDW,395,3,12,0,,0 +1996,3,27,3,1817,1800,1832,1827,NW,825,N912RW,75,87,54,5,17,ATL,MEM,332,4,17,0,,0 +1996,3,28,4,1128,1130,1257,1250,NW,1297,N769NC,89,80,64,7,-2,VPS,MEM,369,9,16,0,,0 +1996,3,10,7,1529,1500,1911,1803,AA,99,N875AA,222,183,168,68,29,JFK,MIA,1090,27,27,0,,0 +1996,3,22,5,2007,2003,2113,2129,TW,237,N922L,66,86,51,-16,4,STL,MKE,317,2,13,0,,0 +1996,3,24,7,1337,1340,1517,1519,NW,321,N295US,160,159,128,-2,-3,DCA,MSP,931,24,8,0,,0 +1996,3,11,1,1901,1905,2023,2031,NW,220,N8944E,82,86,58,-8,-4,MCI,MSP,393,17,7,0,,0 +1996,3,18,1,1148,1150,1741,1726,NW,194,N328US,233,216,211,15,-2,SAN,MSP,1532,4,18,0,,0 +1996,3,12,2,1035,1030,1132,1125,WN,898,N63,57,55,48,7,5,HOU,MSY,303,2,7,0,,0 +1996,3,17,7,1510,1400,1619,1510,WN,1508,N365,69,70,54,69,70,LAX,OAK,337,3,12,0,,0 +1996,3,7,4,935,935,1114,1048,CO,1741,N12539,99,73,62,26,0,IAH,OKC,395,4,33,0,,0 +1996,3,7,4,1429,1431,1436,1439,HP,630,N184AW,67,68,51,-3,-2,PHX,ONT,325,3,13,0,,0 +1996,3,5,2,1901,1830,2103,2012,AA,875,N294AA,182,162,153,51,31,BOS,ORD,867,19,10,0,,0 +1996,3,5,2,1303,1305,1620,1624,AA,1112,N587AA,137,139,119,-4,-2,DEN,ORD,888,5,13,0,,0 +1996,3,28,4,2033,2022,2124,2115,UA,427,N539UA,111,113,90,9,11,IAD,ORD,589,10,11,0,,0 +1996,3,12,2,1450,1450,1611,1612,UA,1460,N9040U,81,82,65,-1,0,MCI,ORD,403,7,9,0,,0 +1996,3,16,6,955,955,1054,1105,AA,273,N640AA,119,130,102,-11,0,PHL,ORD,678,8,9,0,,0 +1996,3,3,7,1918,1850,49,41,UA,152,N530UA,211,231,190,8,28,SFO,ORD,1846,4,17,0,,0 +1996,3,8,5,950,900,1019,930,DL,1438,N489DA,29,30,21,49,50,RIC,ORF,75,2,6,0,,0 +1996,3,31,7,1949,1940,2201,2153,DL,1876,N531DA,132,133,103,8,9,LAX,PDX,834,2,27,0,,0 +1996,3,6,3,845,730,1024,850,US,889,N248US,99,80,59,94,75,BOS,PHL,280,8,32,0,,0 +1996,3,6,3,820,625,1056,907,AA,1856,N719AA,96,102,80,109,115,ORD,PHL,678,5,11,0,,0 +1996,3,9,6,1805,1805,2052,2050,AA,2040,N549AA,107,105,76,2,0,ABQ,DFW,569,17,14,0,,0 +1996,3,29,5,706,705,841,846,AA,1591,N2DCAA,155,161,134,-5,1,DAY,DFW,861,7,14,0,,0 +1996,3,29,5,757,800,854,906,CO,1774,N69523,57,66,41,-12,-3,IAH,DFW,224,4,12,0,,0 +1996,3,13,3,1239,1240,1428,1435,DL,877,N404DA,169,175,147,-7,-1,MIA,DFW,1121,6,16,0,,0 +1996,3,7,4,751,750,950,952,AA,1873,N722AA,179,182,162,-2,1,RDU,DFW,1062,4,13,0,,0 +1996,3,12,2,1955,1955,2207,2153,TW,655,N937F,132,118,87,14,0,STL,DFW,551,5,40,0,,0 +1996,3,28,4,1203,1205,1256,1304,NW,1420,N983US,53,59,32,-8,-2,CMH,DTW,155,13,8,0,,0 +1996,3,17,7,1612,1612,1744,1810,NW,1593,N344NW,92,118,75,-26,0,LGA,DTW,501,8,9,0,,0 +1996,3,3,7,52,45,613,618,NW,256,N531US,201,213,184,-5,7,PHX,DTW,1671,5,12,0,,0 +1996,3,20,3,2102,2010,2150,2100,WN,351,N680,108,110,96,50,52,HOU,ELP,677,3,9,0,,0 +1996,3,7,4,1507,1500,1711,1651,DL,948,N629DL,124,111,97,20,7,CVG,EWR,569,8,19,0,,0 +1996,3,31,7,725,725,1050,1055,NW,770,N9346,145,150,129,-5,0,MSP,EWR,1008,6,10,0,,0 +1996,3,9,6,1607,1600,1648,1637,US,729,N897US,41,37,23,11,7,CLT,FAY,118,6,12,0,,0 +1996,3,19,2,1140,1140,1254,1258,UA,1035,N919UA,134,138,122,-4,0,DEN,GEG,836,2,10,0,,0 +1996,3,24,7,1735,1735,1938,1940,CO,1092,N14212,123,125,108,-2,0,MIA,GSO,710,2,13,0,,0 +1996,3,20,3,700,700,750,755,WN,1,N342,50,55,37,-5,0,DAL,HOU,239,3,10,0,,0 +1996,3,2,6,1334,1335,1637,1639,UA,1518,N346UA,123,124,102,-2,-1,ORD,HPN,738,8,13,0,,0 +1996,3,2,6,1846,1628,25,2215,DL,1426,N676DL,219,227,194,130,138,SLC,IAD,1827,8,17,0,,0 +1996,3,19,2,1148,1150,1337,1346,CO,1749,N73380,169,176,149,-9,-2,DTW,IAH,1076,11,9,0,,0 +1996,3,29,5,1900,1855,2139,2130,UA,1431,N981UA,159,155,134,9,5,ORD,IAH,925,4,21,0,,0 +1996,3,5,2,1025,1023,1445,1446,UA,1080,N378UA,140,143,116,-1,2,DEN,IND,977,7,17,0,,0 +1996,3,16,6,1225,1210,1442,1425,NW,468,N607NW,137,135,113,17,15,DTW,JAX,814,5,19,0,,0 +1996,3,30,6,1023,1017,1652,1635,DL,1424,N635DL,269,258,233,17,6,SLC,JFK,1989,16,20,0,,0 +1996,3,11,1,1505,1505,1604,1605,UA,2031,N203UA,59,60,43,-1,0,LAX,LAS,236,4,12,0,,0 +1996,3,21,4,656,645,754,747,HP,85,N640AW,58,62,46,7,11,SAN,LAS,258,4,8,0,,0 +1996,3,31,7,1745,1730,1853,1845,UA,1193,N1829U,128,135,112,8,15,DEN,LAX,862,5,11,0,,0 +1996,3,13,3,1248,1250,1403,1358,UA,2214,N917UA,75,68,41,5,-2,LAS,LAX,236,7,27,0,,0 +1996,3,20,3,1305,1300,1515,1510,DL,1974,N513DA,130,130,114,5,5,PDX,LAX,834,10,6,0,,0 +1996,3,3,7,1333,1330,1611,1615,UA,224,N9017U,98,105,80,-4,3,ORD,ABE,654,3,15,0,,0 +1996,3,2,6,702,705,820,830,NW,1518,N914RW,78,85,61,-10,-3,DTW,ALB,488,6,11,0,,0 +1996,3,10,7,1341,1335,1624,1622,DL,1055,N120DL,163,167,141,2,6,BOS,ATL,946,6,16,0,,0 +1996,3,28,4,1806,1730,2120,2020,DL,586,N111DN,134,110,104,60,36,DFW,ATL,732,9,21,0,,0 +1996,3,7,4,734,735,834,839,DL,1461,N672DL,60,64,44,-5,-1,JAX,ATL,270,9,7,0,,0 +1996,3,6,3,842,835,1115,1050,DL,684,N102DA,93,75,71,25,7,MSY,ATL,425,7,15,0,,0 +1996,3,19,2,600,605,846,912,DL,392,N283WA,106,127,96,-26,-5,SAT,ATL,874,6,4,0,,0 +1996,3,16,6,2043,2015,2152,2114,AA,1403,N2BVAA,69,59,33,38,28,DFW,AUS,190,4,32,0,,0 +1996,3,13,3,1013,1015,1319,1310,AA,290,N2AXAA,126,115,107,9,-2,ORD,BDL,783,4,15,0,,0 +1996,3,27,3,2152,2140,2208,2200,US,698,N890US,76,80,54,8,12,CLT,B,329,7,15,0,,0 +1996,3,5,2,1350,1347,1625,1612,DL,686,N782DL,155,145,129,13,3,ATL,BOS,946,7,19,0,,0 +1996,3,28,4,2157,2200,620,624,AA,192,N626AA,323,324,296,-4,-3,LAX,BOS,2611,6,21,0,,0 +1996,3,31,7,1229,1225,1316,1253,DL,1115,N920DE,107,88,74,23,4,ATL,BTR,449,4,29,0,,0 +1996,3,20,3,1751,1750,1854,1853,UA,2137,N381UA,63,63,50,1,1,SFO,BUR,326,2,11,0,,0 +1996,3,5,2,1921,1925,2144,2159,AA,448,N871AA,143,154,114,-15,-4,MIA,BWI,946,5,24,0,,0 +1996,3,18,1,1140,1140,1241,1246,TW,488,N490SA,61,66,37,-5,0,STL,CID,228,3,21,0,,0 +1996,3,31,7,1423,1425,1629,1632,CO,1244,N15255,66,67,50,-3,-2,MKE,CLE,328,4,12,0,,0 +1996,3,1,5,1938,1919,2104,2045,US,1852,N898US,86,86,74,19,19,CLE,CLT,430,5,7,0,,0 +1996,3,30,6,1619,1610,1749,1747,US,2164,N602AU,90,97,69,2,9,MCO,CLT,468,5,16,0,,0 +1996,3,25,1,802,730,1042,1007,US,1872,N935VJ,100,97,77,35,32,STL,CLT,575,5,18,0,,0 +1996,3,16,6,1230,1232,1306,1308,UA,1041,N995UA,36,36,16,-2,-2,DEN,COS,72,3,17,0,,0 +1996,3,19,2,700,700,810,803,DL,741,N911DL,70,63,55,7,0,GRR,CVG,268,5,10,0,,0 +1996,3,10,7,1430,1430,2149,2141,DL,946,N482DA,259,251,235,8,0,SFO,CVG,2036,7,17,0,,0 +1996,3,17,7,1505,1505,1559,1605,WN,165,N601,54,60,44,-6,0,MAF,DAL,319,3,7,0,,0 +1996,3,29,5,2000,1958,2107,2100,HP,262,N622AW,67,62,50,7,2,CMH,DCA,322,4,13,0,,0 +1996,3,28,4,1214,1214,1505,1456,UA,612,N424UA,111,102,84,9,0,ORD,DCA,612,11,16,0,,0 +1996,3,17,7,1918,1920,2010,2021,UA,1576,N978UA,112,121,91,-11,-2,DFW,DEN,641,8,13,0,,0 +1996,3,3,7,1416,1415,1731,1737,UA,1794,N301UA,135,142,115,-6,1,OAK,DEN,957,8,12,0,,0 +1996,3,27,3,1800,1700,2106,2008,UA,1504,N401UA,126,128,103,58,60,S,DEN,846,7,16,0,,0 +1996,4,14,7,1845,1830,1936,1930,WN,595,N395,51,60,41,6,15,LAS,PHX,256,4,6,0,,0 +1996,4,18,4,952,950,1126,1123,UA,345,N1832U,214,213,196,3,2,ORD,PHX,1440,4,14,0,,0 +1996,4,3,3,1515,1515,1650,1650,WN,1154,N351,155,155,143,0,0,TUL,PHX,935,5,7,0,,0 +1996,4,16,2,1141,1040,1234,1138,NW,700,N922RW,53,58,38,56,61,DTW,PIT,201,7,8,0,,0 +1996,4,19,5,1011,1007,1123,1114,US,506,N442US,72,67,49,9,4,PHL,PIT,267,6,17,0,,0 +1996,4,13,6,1655,1655,1830,1842,NW,1446,N767NC,95,107,77,-12,0,DTW,PVD,614,4,14,0,,0 +1996,4,14,7,1035,1035,1139,1149,US,1923,N254AU,64,74,45,-10,0,LGA,RIC,292,5,14,0,,0 +1996,4,11,4,1444,1445,1519,1523,NW,676,N941N,35,38,18,-4,-1,MSP,RST,76,4,13,0,,0 +1996,4,30,2,1800,1800,1912,1920,WN,987,N91,72,80,64,-8,0,OAK,SAN,446,2,6,0,,0 +1996,4,9,2,1920,1920,2020,2026,AA,2272,N587AA,60,66,42,-6,0,DFW,SAT,247,4,14,0,,0 +1996,4,11,4,1222,1225,1332,1343,NW,1493,N93S,70,78,50,-11,-3,DTW,SDF,306,7,13,0,,0 +1996,4,24,3,951,951,1225,1223,AS,305,N955AS,154,152,136,2,0,LAX,SEA,954,2,16,0,,0 +1996,4,30,2,850,850,947,945,DL,1947,N541DA,117,115,100,2,0,SLC,SEA,689,5,12,0,,0 +1996,4,23,2,1627,1630,1941,1946,AA,35,N303AA,374,376,349,-5,-3,JFK,SFO,2586,4,21,0,,0 +1996,4,27,6,1824,1805,1944,1942,UA,2061,N383UA,80,97,68,2,19,PDX,SFO,550,3,9,0,,0 +1996,4,5,5,1642,1643,1813,1818,TW,471,N935L,91,95,77,-5,-1,STL,SHV,476,3,11,0,,0 +1996,4,9,2,927,930,1318,1320,US,1969,N778AU,231,230,212,-2,-3,BWI,SJU,1565,7,12,0,,0 +1996,4,30,2,1311,1315,1525,1533,DL,1898,N660DL,74,78,53,-8,-4,LAS,SLC,368,7,14,0,,0 +1996,4,17,3,1030,1030,1256,1254,DL,1957,N308WA,86,84,69,2,0,SMF,SLC,532,3,14,0,,0 +1996,4,1,1,1853,1855,2034,2050,NW,205,N316US,281,295,259,-16,-2,DTW,S,1960,4,18,0,,0 +1996,4,2,2,830,825,952,940,WN,1565,N312,82,75,66,12,5,BHM,STL,410,2,14,0,,0 +1996,4,9,2,822,815,1012,1000,TW,257,N54349,170,165,150,12,7,FLL,STL,1056,7,13,0,,0 +1996,4,24,3,1954,1955,2102,2108,NW,945,N959N,68,73,48,-6,-1,MEM,STL,256,9,11,0,,0 +1996,4,5,5,1818,1820,1814,1827,TW,371,N417EA,56,67,48,-13,-2,SDF,STL,254,2,6,0,,0 +1996,4,11,4,2319,2319,35,25,DL,664,N2821W,76,66,54,10,0,ATL,TPA,406,5,17,0,,0 +1996,4,18,4,1849,1850,2206,2219,TW,204,N917TW,137,149,104,-13,-1,STL,TPA,869,3,30,0,,0 +1996,4,16,2,,1105,,1154,US,1821,UNKNOW,,49,,,,CLT,TYS,177,0,0,1,,0 +1996,4,8,1,2038,2030,2225,2231,DL,578,N920DL,107,121,90,-6,8,ATL,LGA,761,6,11,0,,0 +1996,4,4,4,1418,1420,1832,1836,CO,1828,N58606,194,196,175,-4,-2,IAH,LGA,1416,5,14,0,,0 +1996,4,13,6,915,915,1016,1010,WN,8,N26,61,55,50,6,0,DAL,LIT,296,3,8,0,,0 +1996,4,8,1,809,735,1018,954,US,204,N559AU,189,199,161,24,34,LGA,MCI,1107,5,23,0,,0 +1996,4,8,1,851,850,1050,1044,DL,903,N613DL,119,114,101,6,1,CVG,MCO,756,5,13,0,,0 +1996,4,12,5,1026,1025,1326,1322,US,1591,N225US,180,177,154,4,1,PVD,MCO,1073,19,7,0,,0 +1996,4,2,2,1316,1310,1421,1425,WN,1051,N104,65,75,57,-4,6,OMA,MDW,423,3,5,0,,0 +1996,4,6,6,1112,1115,1247,1249,NW,475,N960N,95,94,80,-2,-3,ORD,MEM,491,3,12,0,,0 +1996,4,8,1,1653,1645,1953,1946,NW,991,N953N,180,181,160,7,8,DTW,MIA,1145,5,15,0,,0 +1996,4,11,4,2001,2005,2217,2230,CO,1863,N27610,136,145,117,-13,-4,IAH,MKE,984,4,15,0,,0 +1996,4,5,5,700,700,746,758,NW,707,N920RW,106,118,93,-12,0,CMH,MSP,627,5,8,0,,0 +1996,4,4,4,1151,1155,1335,1351,NW,505,N201US,164,176,146,-16,-4,LGA,MSP,1020,5,13,0,,0 +1996,4,7,7,1307,1310,1347,1350,NW,774,N926RC,40,40,31,-3,-3,RST,MSP,76,4,5,0,,0 +1996,4,18,4,1604,1600,1657,1700,WN,625,N335,53,60,45,-3,4,HOU,MSY,303,2,6,0,,0 +1996,4,7,7,1829,1700,1926,1810,WN,1417,N373,57,70,47,76,89,LAX,OAK,337,2,8,0,,0 +1996,4,12,5,930,935,1037,1048,CO,1741,N12508,67,73,52,-11,-5,IAH,OKC,395,3,12,0,,0 +1996,4,15,1,1605,1605,1723,1711,HP,2632,N147AW,78,66,53,12,0,PHX,ONT,325,4,21,0,,0 +1996,4,19,5,1726,1730,1941,1916,AA,1849,N295AA,195,166,139,25,-4,BOS,ORD,867,35,21,0,,0 +1996,4,4,4,1800,1757,2115,2115,UA,1216,N368UA,135,138,113,0,3,DEN,ORD,888,11,11,0,,0 +1996,4,16,2,1703,1700,1922,1921,UA,1642,N982UA,139,141,128,1,3,IAH,ORD,925,5,6,0,,0 +1996,4,21,7,1946,1950,2118,2135,NW,474,N675MC,92,105,79,-17,-4,MEM,ORD,491,4,9,0,,0 +1996,4,10,3,1725,1725,2239,2230,HP,8,N902AW,194,185,172,9,0,PHX,ORD,1440,5,17,0,,0 +1996,4,20,6,700,700,1248,1248,UA,1076,N7275U,228,228,205,0,0,SMF,ORD,1781,8,15,0,,0 +1996,4,23,2,1311,1308,1701,1647,DL,1670,N926DL,170,159,134,14,3,DFW,PBI,1103,4,32,0,,0 +1996,4,27,6,1400,1352,1440,1436,AS,516,N940AS,40,44,25,4,8,SEA,PDX,129,2,13,0,,0 +1996,4,5,5,2100,2021,101,22,AA,1180,N519AA,181,181,145,39,39,DFW,PHL,1302,5,31,0,,0 +1996,4,17,3,1257,1255,1534,1528,US,1028,N823US,157,153,141,6,2,RSW,PHL,992,5,11,0,,0 +1996,4,18,4,1400,1400,1511,1502,AA,736,N468AA,71,62,52,9,0,AUS,DFW,190,12,7,0,,0 +1996,4,28,7,937,940,1137,1142,NW,691,N3322L,180,182,155,-5,-3,DTW,DFW,987,6,19,0,,0 +1996,4,4,4,710,710,1204,1216,DL,1262,N511DA,174,186,153,-12,0,LAX,DFW,1235,6,15,0,,0 +1996,4,7,7,1759,1800,2032,2026,AA,2249,N578AA,153,146,111,6,-1,ORD,DFW,802,32,10,0,,0 +1996,4,3,3,633,635,1204,1202,AA,1752,N210AA,211,207,181,2,-2,SFO,DFW,1464,11,19,0,,0 +1996,4,26,5,1720,1705,1909,1859,DL,1026,N106DA,109,114,89,10,15,ATL,DTW,594,3,17,0,,0 +1996,4,20,6,707,710,759,753,NW,484,N720RC,52,43,29,6,-3,GRR,DTW,120,11,12,0,,0 +1996,4,18,4,2143,2145,12,14,NW,360,N335NW,89,89,71,-2,-2,MSP,DTW,528,4,14,0,,0 +1996,4,2,2,1259,1300,1545,1548,NW,483,N721RW,166,168,145,-3,-1,TPA,DTW,983,9,12,0,,0 +1996,4,27,6,603,600,708,716,CO,469,N72830,65,76,46,-8,3,BOS,EWR,200,7,12,0,,0 +1996,4,15,1,1805,1805,2143,2138,CO,1018,N17614,158,153,135,5,0,MCI,EWR,1092,6,17,0,,0 +1996,4,11,4,716,700,1003,935,CO,440,N14871,167,155,151,28,16,TPA,EWR,998,6,10,0,,0 +1996,4,21,7,945,945,1035,1040,WN,1750,N378,50,55,35,-5,0,TPA,FLL,197,5,10,0,,0 +1996,4,12,5,649,645,820,819,CO,1091,N14335,91,94,66,1,4,EWR,GSO,446,3,22,0,,0 +1996,4,19,5,655,655,744,740,WN,8,N394,49,45,37,4,0,CRP,HOU,187,5,7,0,,0 +1996,4,5,5,1343,1345,1514,1524,NW,1150,N8950E,91,99,75,-10,-2,DTW,HPN,505,4,12,0,,0 +1996,4,27,6,2211,2210,532,551,UA,50,N1849U,261,281,244,-19,1,SFO,IAD,2419,3,14,0,,0 +1996,4,18,4,732,738,824,835,DL,1467,N542DA,52,57,33,-11,-6,DFW,IAH,224,5,14,0,,0 +1996,4,4,4,621,620,855,851,CO,1693,N70330,214,211,195,4,1,PHL,IAH,1324,6,13,0,,0 +1996,4,23,2,1727,1719,1940,1924,AA,462,N221AA,133,125,104,16,8,DFW,IND,762,11,18,0,,0 +1996,4,27,6,2042,2045,2343,2354,UA,554,N7276U,121,129,100,-11,-3,ORD,JAX,865,3,18,0,,0 +1996,4,11,4,921,915,1124,1136,UA,41,N1828U,303,321,283,-12,6,SFO,KOA,2367,5,15,0,,0 +1996,4,2,2,2105,2105,2155,2200,WN,538,N512,50,55,42,-5,0,LAX,LAS,236,3,5,0,,0 +1996,4,16,2,840,840,939,925,WN,397,N603,179,165,168,14,0,SAT,LAS,1069,3,8,0,,0 +1996,4,25,4,1233,1235,1336,1354,AA,1223,N573AA,183,199,163,-18,-2,DFW,LAX,1235,11,9,0,,0 +1996,4,5,5,650,650,750,750,WN,1650,N502,60,60,37,0,0,LAS,LAX,236,10,13,0,,0 +1996,4,10,3,2040,2040,2152,2158,UA,2245,N365UA,72,78,59,-6,0,PHX,LAX,370,6,7,0,,0 +1996,4,22,1,1813,1815,1927,1927,UA,505,N998UA,74,72,54,0,-2,DEN,ABQ,349,3,17,0,,0 +1996,4,4,4,2225,2210,2323,2315,WN,62,N605,58,65,45,8,15,DAL,AMA,324,3,10,0,,0 +1996,4,12,5,1719,1705,1832,1814,DL,390,N906DL,73,69,57,18,14,CHS,ATL,259,7,9,0,,0 +1996,4,9,2,1501,1500,1801,1723,CO,1419,N37882,180,143,116,38,1,EWR,ATL,745,7,57,0,,0 +1996,4,29,1,1614,1600,2010,1827,DL,627,N914DL,236,147,202,103,14,LGA,ATL,761,10,24,0,,0 +1996,4,17,3,1607,1605,1748,1742,DL,2073,N902DE,101,97,83,6,2,ORF,ATL,516,11,7,0,,0 +1996,4,4,4,913,910,1059,1036,DL,1188,N917DE,106,86,90,23,3,SRQ,ATL,445,8,8,0,,0 +1996,4,19,5,1013,1010,1246,1241,AA,1491,N2CUAA,153,151,144,5,3,ORD,AUS,978,2,7,0,,0 +1996,4,3,3,1709,1708,1751,1811,US,955,N924VJ,102,123,93,-20,1,BWI,BHM,682,2,7,0,,0 +1996,4,7,7,727,710,825,820,WN,741,N50,58,70,50,5,17,MDW,B,395,2,6,0,,0 +1996,4,1,1,1059,1100,1227,1226,US,1862,N405US,88,86,62,1,-1,DCA,BOS,399,7,19,0,,0 +1996,4,20,6,1347,1345,1702,1702,UA,388,N7458U,135,137,103,0,2,ORD,BOS,867,16,16,0,,0 +1996,4,23,2,1906,1845,2140,1950,US,819,N235US,154,65,47,110,21,PHL,BUF,279,5,102,0,,0 +1996,4,25,4,1841,1835,2004,1950,US,872,N476US,83,75,67,14,6,CLT,BWI,361,7,9,0,,0 +1996,4,28,7,2143,2132,2250,2245,DL,1882,N306WA,67,73,54,5,11,SLC,BZN,347,3,10,0,,0 +1996,4,14,7,1712,1655,1840,1835,CO,1619,N14307,88,100,63,5,17,EWR,CLE,404,2,23,0,,0 +1996,4,15,1,1619,1614,1811,1815,US,238,N276AU,112,121,100,-4,5,BDL,CLT,644,3,9,0,,0 +1996,4,18,4,631,630,739,742,US,1979,N478US,68,72,51,-3,1,IAD,CLT,321,3,14,0,,0 +1996,4,29,1,1640,1520,1725,1608,US,1998,N484US,45,48,32,77,80,RDU,CLT,130,7,6,0,,0 +1996,4,10,3,1930,1930,2128,2130,WN,875,N53,58,60,48,-2,0,MDW,CMH,284,3,7,0,,0 +1996,4,24,3,2036,2035,2126,2125,DL,1809,N921DL,50,50,37,1,1,CLE,CVG,221,5,8,0,,0 +1996,4,17,3,1724,1725,1929,1933,DL,645,N314DA,125,128,108,-4,-1,PVD,CVG,722,6,11,0,,0 +1996,4,14,7,2030,2030,2119,2120,WN,60,N689,49,50,42,-1,0,HOU,DAL,239,2,5,0,,0 +1996,4,15,1,804,800,942,941,US,358,N937VJ,98,101,75,1,4,BOS,DCA,399,8,15,0,,0 +1996,4,3,3,1331,1330,1554,1558,AA,1506,N641AA,143,148,125,-4,1,MIA,DCA,920,3,15,0,,0 +1996,4,20,6,1258,1255,1352,1345,DL,1497,N928DL,174,170,161,7,3,CVG,DEN,1069,5,8,0,,0 +1996,4,30,2,1605,1550,1649,1646,UA,1165,N7261U,104,116,91,3,15,MSP,DEN,680,3,10,0,,0 +1996,4,2,2,1118,1120,1423,1432,UA,1496,N988UA,125,132,112,-9,-2,SMF,DEN,910,5,8,0,,0 +1996,5,10,5,1928,1930,2028,2030,HP,1236,N640AW,60,60,44,-2,-2,LAS,PHX,256,6,10,0,,0 +1996,5,25,6,1325,1325,1459,1506,AA,239,N552AA,214,221,199,-7,0,ORD,PHX,1440,5,10,0,,0 +1996,5,13,1,909,910,1027,1033,TW,169,N54340,198,203,173,-6,-1,STL,PHX,1262,4,21,0,,0 +1996,5,27,1,1941,1940,2046,2032,US,1197,N449US,65,52,38,14,1,DAY,PIT,215,16,11,0,,0 +1996,5,11,6,,720,,1044,US,1450,UNKNOW,,144,,,,MSY,PIT,918,0,0,1,,0 +1996,5,8,3,1052,1054,1109,1113,AS,65,N744AS,17,19,9,-4,-2,WRG,PSG,31,3,5,0,,0 +1996,5,17,5,2115,2110,4,2358,TW,608,N928L,109,108,85,6,5,STL,RDU,667,3,21,0,,0 +1996,5,8,3,950,945,1132,1125,US,1278,N968VJ,102,100,85,7,5,CLT,ROC,573,3,14,0,,0 +1996,5,31,5,1926,1930,2024,2030,HP,863,112,58,60,47,-6,-4,LAS,SAN,258,4,7,0,,0 +1996,5,2,4,1607,1600,1710,1710,WN,1761,N330,63,70,50,0,7,TUS,SAN,367,2,11,0,,0 +1996,5,15,3,1227,1230,1220,1220,NW,688,N930RC,53,50,36,0,-3,DTW,SBN,157,3,14,0,,0 +1996,5,18,6,1238,1220,1431,1405,NW,265,N530US,293,285,264,26,18,DTW,SEA,1927,5,24,0,,0 +1996,5,21,2,1629,1629,1801,1810,AS,603,N938AS,92,101,80,-9,0,RNO,SEA,564,3,9,0,,0 +1996,5,16,4,1913,1720,2101,1854,UA,1653,N301UA,168,154,151,127,113,DEN,SFO,967,6,11,0,,0 +1996,5,21,2,1311,1217,1524,1345,UA,2398,N399UA,133,88,115,99,54,LAX,SFO,337,3,15,0,,0 +1996,5,31,5,1505,1505,1620,1630,WN,320,N374,75,85,67,-10,0,SAN,SFO,447,2,6,0,,0 +1996,5,10,5,1800,1800,1858,1905,WN,1126,N325,58,65,49,-7,0,ONT,SJC,333,3,6,0,,0 +1996,5,21,2,1004,1006,1200,1155,DL,1461,N636DL,236,229,211,5,-2,ATL,SLC,1589,5,20,0,,0 +1996,5,14,2,649,650,808,807,DL,2038,N308DL,139,137,126,1,-1,OMA,SLC,839,4,9,0,,0 +1996,5,6,1,2040,2040,2155,2155,WN,810,N376,75,75,61,0,0,LAX,SMF,373,3,11,0,,0 +1996,5,8,3,600,600,720,715,HP,661,N314AW,80,75,57,5,0,PHX,S,338,5,18,0,,0 +1996,5,5,7,1902,1825,1934,1853,TW,211,N9402W,92,88,77,41,37,CMH,STL,410,6,9,0,,0 +1996,5,5,7,922,910,1019,1005,WN,653,N51,57,55,45,14,12,IND,STL,229,2,10,0,,0 +1996,5,19,7,1235,1235,1423,1422,TW,541,N978Z,108,107,88,1,0,MSY,STL,604,9,11,0,,0 +1996,5,23,4,1329,1330,1715,1719,TW,138,N918TW,166,169,142,-4,-1,SLC,STL,1156,17,7,0,,0 +1996,5,11,6,2022,2025,2220,2216,DL,201,N405DA,118,111,97,4,-3,CVG,TPA,773,3,18,0,,0 +1996,5,21,2,1542,1455,1655,1615,WN,875,N687,73,80,64,40,47,HOU,TUL,453,2,7,0,,0 +1996,5,3,5,1843,1842,2010,2004,UA,2051,N929UA,87,82,62,6,1,SFO,LAX,337,8,17,0,,0 +1996,5,24,5,1331,1330,1431,1429,DL,1835,N474DA,60,59,46,2,1,BOS,LGA,185,3,11,0,,0 +1996,5,29,3,1537,1435,1830,1705,DL,1160,N903DE,173,150,133,85,62,MCO,LGA,950,7,33,0,,0 +1996,5,21,2,1945,1942,2047,2045,DL,1688,N956DL,62,63,46,2,3,DFW,LIT,304,5,11,0,,0 +1996,5,9,4,2318,1945,142,2105,WN,835,N24,144,80,69,277,213,MDW,MCI,405,5,70,0,,0 +1996,5,10,5,1041,1045,1243,1255,DL,1805,N900DE,122,130,104,-12,-4,DCA,MCO,759,6,12,0,,0 +1996,5,14,2,833,835,1041,1053,US,944,N390US,128,138,104,-12,-2,PIT,MCO,834,4,20,0,,0 +1996,5,15,3,2128,2130,2242,2248,NW,1076,N763NC,74,78,54,-6,-2,MSP,MDW,349,4,16,0,,0 +1996,5,16,4,1129,1130,1258,1247,NW,820,N203US,89,77,70,11,-1,MSY,MEM,349,3,16,0,,0 +1996,5,18,6,2023,2025,2357,4,AA,1158,N731AA,154,159,133,-7,-2,DFW,MIA,1121,4,17,0,,0 +1996,5,23,4,1026,1015,1115,1116,US,1039,N980VJ,109,121,95,-1,11,CLT,MKE,651,3,11,0,,0 +1996,5,14,2,831,830,1033,1002,NW,189,N320US,182,152,163,31,1,BWI,MSP,936,3,16,0,,0 +1996,5,29,3,1431,1430,1718,1708,CO,542,N12327,167,158,144,10,1,IAH,MSP,1034,4,19,0,,0 +1996,5,25,6,1714,1715,1902,1908,NW,185,N349NW,168,173,147,-6,-1,PHL,MSP,980,6,15,0,,0 +1996,5,31,5,1715,1714,1830,1840,AA,2016,N564AA,75,86,59,-10,1,DFW,MSY,448,3,13,0,,0 +1996,5,9,4,1235,1235,1355,1400,WN,692,N352,80,85,67,-5,0,LAS,OAK,407,3,10,0,,0 +1996,5,6,1,2035,2035,2148,2152,AS,479,N764AS,73,77,63,-4,0,S,OAK,371,4,6,0,,0 +1996,5,16,4,1135,1135,1239,1243,UA,425,N937UA,124,128,111,-4,0,DEN,ONT,819,2,11,0,,0 +1996,5,3,5,1005,1005,1056,1111,DL,1920,N375DL,111,126,90,-15,0,ATL,ORD,606,5,16,0,,0 +1996,5,20,1,1526,1450,1540,1501,DL,1230,N922DL,74,71,43,39,36,CVG,ORD,264,7,24,0,,0 +1996,5,9,4,842,830,1020,947,UA,641,N9015U,158,137,121,33,12,EWR,ORD,719,6,31,0,,0 +1996,5,17,5,859,900,1018,1018,AA,313,N520AA,139,138,111,0,-1,LGA,ORD,733,7,21,0,,0 +1996,5,22,3,758,800,904,913,UA,1876,N9039U,66,73,50,-9,-2,MSP,ORD,334,7,9,0,,0 +1996,5,23,4,1512,1337,2047,1926,UA,252,N529UA,215,229,194,81,95,SAN,ORD,1723,11,10,0,,0 +1996,5,13,1,1346,1344,1514,1515,DL,638,N908DE,88,91,68,-1,2,ATL,ORF,516,5,15,0,,0 +1996,5,11,6,1320,1320,1416,1425,WN,595,N614,56,65,49,-9,0,GEG,PDX,279,1,6,0,,0 +1996,5,11,6,732,730,924,924,US,311,N912VJ,112,114,98,0,2,ATL,PHL,665,3,11,0,,0 +1996,5,19,7,701,700,916,925,US,1868,N373US,135,145,117,-9,1,MCO,PHL,861,4,14,0,,0 +1996,5,24,5,1710,1710,1729,1730,HP,416,N304AW,139,140,126,-1,0,AUS,PHX,872,3,10,0,,0 +1996,5,29,3,1628,1628,1934,1939,AA,1557,N291AA,246,251,227,-5,0,BOS,DFW,1562,9,10,0,,0 +1996,5,9,4,705,705,1226,1208,AA,1560,N488AA,201,183,179,18,0,FAT,DFW,1313,9,13,0,,0 +1996,5,15,3,1305,1305,1439,1447,AA,580,N2CA,94,102,71,-8,0,MCI,DFW,460,15,8,0,,0 +1996,5,22,3,1212,1210,1351,1405,DL,772,N919DL,159,175,142,-14,2,PBI,DFW,1103,7,10,0,,0 +1996,5,20,1,1323,1325,1834,1844,AA,2202,N493AA,191,199,167,-10,-2,SJC,DFW,1438,12,12,0,,0 +1996,5,19,7,1144,1145,1402,1422,NW,1734,N960N,78,97,65,-20,-1,B,DTW,457,7,6,0,,0 +1996,5,18,6,952,955,1131,1137,NW,273,N8929E,99,102,82,-6,-3,HPN,DTW,505,5,12,0,,0 +1996,5,20,1,1828,1830,2154,2122,NW,762,N162US,146,112,101,32,-2,MSP,DTW,528,13,32,0,,0 +1996,5,12,7,1753,1750,1926,1921,NW,1540,N3312L,93,91,69,5,3,TYS,DTW,443,17,7,0,,0 +1996,5,24,5,1504,1500,1630,1620,CO,1217,N17317,86,80,58,10,4,BOS,EWR,200,14,14,0,,0 +1996,5,19,7,1319,1300,2108,2112,UA,80,N516UA,289,312,263,-4,19,LAX,EWR,2454,8,18,0,,0 +1996,5,4,6,1523,1520,1844,1848,TW,32,N916TW,141,148,127,-4,3,STL,EWR,872,4,10,0,,0 +1996,5,25,6,820,820,908,915,WN,1652,N80,48,55,38,-7,0,TPA,FLL,197,3,7,0,,0 +1996,5,22,3,1321,1320,1424,1420,CO,1053,N15255,63,60,49,4,1,DCA,GSO,248,4,10,0,,0 +1996,5,8,3,1355,1355,1536,1550,WN,360,N619,101,115,93,-14,0,B,HOU,670,2,6,0,,0 +1996,5,14,2,1510,1510,1705,1715,WN,759,N73,115,125,97,-10,0,STL,HOU,687,5,13,0,,0 +1996,5,21,2,1242,1245,1603,1609,UA,1878,N317UA,141,144,123,-6,-3,MSY,IAD,954,6,12,0,,0 +1996,5,17,5,1722,1720,1828,1831,AA,2065,N2CPAA,66,71,40,-3,2,DFW,IAH,224,6,20,0,,0 +1996,5,21,2,1642,1645,1754,1802,CO,1926,N43537,72,77,60,-8,-3,OKC,IAH,395,6,6,0,,0 +1996,5,2,4,2013,2015,2057,2105,US,1219,N493US,44,50,29,-8,-2,CLT,ILM,185,4,11,0,,0 +1996,5,1,3,1523,1521,1633,1625,DL,264,N106DA,70,64,46,8,2,ATL,JAX,270,4,20,0,,0 +1996,5,11,6,749,745,1533,1549,UA,300,N577UA,284,304,265,-16,4,SEA,JFK,2421,5,14,0,,0 +1996,5,12,7,1200,1200,1257,1310,WN,320,N332,177,190,166,-13,0,HOU,LAS,1235,2,9,0,,0 +1996,5,8,3,2315,2315,29,14,HP,352,N311AW,74,59,42,15,0,PHX,LAS,256,26,6,0,,0 +1996,5,11,6,1405,1405,1454,1500,WN,789,N388,109,115,97,-6,0,ABQ,LAX,677,6,6,0,,0 +1996,5,17,5,1927,1930,2209,2230,AA,29,N304AA,342,360,317,-21,-3,JFK,LAX,2475,4,21,0,,0 +1996,5,27,1,1849,1830,2111,2054,AA,41,N5CSAA,262,264,236,17,19,ORD,LAX,1745,15,11,0,,0 +1996,5,28,2,1702,1630,1934,1904,UA,1175,N358UA,152,154,132,30,32,SEA,LAX,954,8,12,0,,0 +1996,5,21,2,1100,1030,1417,1340,WN,962,N311,137,130,119,37,30,SFO,ABQ,896,3,15,0,,0 +1996,5,22,3,1722,1720,1812,1804,DL,1478,N913DL,50,44,31,8,2,AGS,ATL,143,7,12,0,,0 +1996,5,1,3,1607,1600,1756,1746,DL,1273,N636DL,109,106,92,10,7,DCA,ATL,547,5,12,0,,0 +1996,5,6,1,551,550,731,737,DL,1442,N2811W,40,47,29,-6,1,HSV,ATL,151,4,7,0,,0 +1996,5,8,3,2028,2030,2208,2210,DL,362,N1734D,100,100,79,-2,-2,MIA,ATL,595,10,11,0,,0 +1996,5,3,5,1755,1755,1954,1958,DL,1620,N915DL,59,63,46,-4,0,PNS,ATL,272,6,7,0,,0 +1996,5,25,6,1334,1335,1627,1624,DL,1917,N328DL,113,109,101,3,-1,TUL,ATL,674,4,8,0,,0 +1996,5,19,7,1454,1500,1703,1720,NW,1512,N9344,69,80,55,-17,-6,MSP,AZO,426,4,10,0,,0 +1996,5,29,3,1502,1500,1545,1546,US,527,N230AU,103,106,92,-1,2,PIT,BHM,598,3,8,0,,0 +1996,5,4,6,946,947,1016,1022,US,224,N918VJ,90,95,71,-6,-1,PIT,B,462,5,14,0,,0 +1996,5,23,4,1159,1205,1347,1354,NW,382,N321US,108,109,83,-7,-6,DTW,BOS,632,7,18,0,,0 +1996,5,21,2,831,830,944,944,US,326,N263AU,73,74,49,0,1,PHL,BOS,280,5,19,0,,0 +1996,5,19,7,1639,1635,1738,1730,WN,494,N519,59,55,47,8,4,LAS,BUR,223,3,9,0,,0 +1996,5,25,6,1934,1645,2042,1752,HP,246,N324AW,68,67,52,170,169,CMH,BWI,336,7,9,0,,0 +1996,5,24,5,1925,1925,2026,2017,DL,1796,N987DL,61,52,32,9,0,ATL,CAE,191,4,25,0,,0 +1996,5,17,5,646,650,821,822,CO,1623,N83870,95,92,73,-1,-4,EWR,CLE,404,5,17,0,,0 +1996,5,8,3,1358,1357,1545,1549,US,1091,N287AU,107,112,93,-4,1,BDL,CLT,644,7,7,0,,0 +1996,5,12,7,912,910,1032,1025,US,1505,N285AU,80,75,60,7,2,IAD,CLT,321,6,14,0,,0 +1996,5,11,6,1855,1818,1936,1905,US,426,N897US,41,47,27,31,37,RDU,CLT,130,4,10,0,,0 +1996,5,5,7,1355,1355,1614,1605,HP,246,N138AW,139,130,124,9,0,MCO,CMH,802,3,12,0,,0 +1996,5,10,5,600,600,809,814,DL,1779,N680DA,129,134,114,-5,0,BOS,CVG,752,5,10,0,,0 +1996,5,4,6,1820,1740,1951,1910,DL,2093,N328DL,91,90,77,41,40,ORF,CVG,485,6,8,0,,0 +1996,5,4,6,900,900,949,955,WN,12,N510,49,55,41,-6,0,HOU,DAL,239,3,5,0,,0 +1996,5,4,6,1429,1259,1647,1510,TW,228,N977Z,78,71,55,97,90,STL,DAY,338,4,19,0,,0 +1996,5,16,4,1033,1030,1136,1132,DL,1749,N414DA,63,62,39,4,3,LGA,DCA,214,14,10,0,,0 +1996,5,24,5,902,900,1033,1041,UA,1629,N976UA,151,161,137,-8,2,B,DEN,1013,8,6,0,,0 +1996,5,3,5,931,930,1229,1249,UA,1192,N988UA,118,139,102,-20,1,LAX,DEN,862,3,13,0,,0 +1996,5,31,5,616,610,936,937,UA,404,N530UA,140,147,126,-1,6,SEA,DEN,1024,4,10,0,,0 +1996,6,5,3,1810,1740,2037,2006,HP,68,N906AW,327,326,283,31,30,EWR,PHX,2133,4,40,0,,0 +1996,6,11,2,1425,1425,1623,1614,HP,2416,N187AW,118,109,102,9,0,OAK,PHX,646,6,10,0,,0 +1996,6,1,6,1445,1445,1511,1519,DL,1449,N503DA,86,94,69,-8,0,SLC,PHX,507,4,13,0,,0 +1996,6,7,5,1852,1842,1933,1925,US,1457,N921VJ,41,43,29,8,10,CLE,PIT,105,3,9,0,,0 +1996,6,6,4,1249,1245,1505,1500,US,1402,N600AU,136,135,111,5,4,MCO,PIT,834,10,15,0,,0 +1996,6,27,4,1704,1705,1702,1708,DL,1863,N920DL,58,63,43,-6,-1,ATL,PNS,272,4,11,0,,0 +1996,6,14,5,1832,1830,2148,2116,AA,1580,N474AA,136,106,98,32,2,ORD,RDU,647,3,35,0,,0 +1996,6,17,1,1214,1215,1258,1301,US,735,N483US,44,46,31,-3,-1,CLT,ROA,155,3,10,0,,0 +1996,6,29,6,1717,1710,1919,1923,UA,175,N558UA,302,313,272,-4,7,IAD,SAN,2253,2,28,0,,0 +1996,6,3,1,915,915,1029,1035,WN,1552,N337,74,80,66,-6,0,SMF,SAN,480,1,7,0,,0 +1996,6,21,5,2150,2140,2241,2233,US,1525,N820US,51,53,36,8,10,CLT,SAV,213,5,10,0,,0 +1996,6,16,7,1124,1125,1246,1258,UA,1433,N1810U,142,153,126,-12,-1,DEN,SEA,1024,3,13,0,,0 +1996,6,9,7,19,2205,227,19,UA,537,N919UA,248,254,224,128,134,ORD,SEA,1721,4,20,0,,0 +1996,6,28,5,1402,1405,1502,1515,UA,2410,N302UA,60,70,51,-13,-3,BUR,SFO,326,2,7,0,,0 +1996,6,12,3,912,912,1020,1035,UA,2014,N303UA,68,83,55,-15,0,LAX,SFO,337,3,10,0,,0 +1996,6,2,7,700,700,821,825,AS,473,N936AS,81,85,65,-4,0,PSP,SFO,421,5,11,0,,0 +1996,6,6,4,935,930,1124,1134,CO,1857,N16617,229,244,209,-10,5,IAH,SJC,1608,5,15,0,,0 +1996,6,16,7,1921,1915,2159,2154,AA,513,N073AA,158,159,130,5,6,MIA,SJU,1045,5,23,0,,0 +1996,6,11,2,1952,1935,2224,2210,WN,1517,N324,92,95,83,14,17,LAX,SLC,590,2,7,0,,0 +1996,6,6,4,1100,1100,1206,1210,WN,885,N376,66,70,53,-4,0,BUR,SMF,358,5,8,0,,0 +1996,6,19,3,1314,1314,1438,1429,AS,340,N767AS,84,75,70,9,0,OAK,S,371,5,9,0,,0 +1996,6,17,1,1835,1720,1939,1830,WN,1780,N93,124,130,116,69,75,BWI,STL,737,3,5,0,,0 +1996,6,12,3,920,920,1045,1033,TW,425,N990Z,145,133,128,12,0,IAD,STL,696,2,15,0,,0 +1996,6,29,6,1132,1135,1306,1313,NW,597,N956N,94,98,68,-7,-3,MSP,STL,449,7,19,0,,0 +1996,6,24,1,1316,1210,1915,1807,TW,204,N912TW,239,237,201,68,66,SFO,STL,1736,4,34,0,,0 +1996,6,24,1,2319,2035,128,2252,US,2149,N518AU,129,137,113,156,164,BWI,TPA,842,2,14,0,,0 +1996,6,26,3,2025,2024,2146,2131,AA,1933,N893AA,81,67,40,15,1,DFW,TUL,237,2,39,0,,0 +1996,6,7,5,1240,1240,1350,1402,UA,2025,N202UA,70,82,54,-12,0,SFO,LAX,337,6,10,0,,0 +1996,6,12,3,630,630,725,732,DL,1821,N491DA,55,62,42,-7,0,BOS,LGA,185,1,12,0,,0 +1996,6,20,4,1751,1750,2017,2018,DL,492,N911DL,146,148,131,-1,1,MCO,LGA,950,6,9,0,,0 +1996,6,28,5,1309,1310,1435,1420,DL,1262,N2812W,86,70,49,15,-1,DFW,LIT,304,5,32,0,,0 +1996,6,9,7,1200,1200,1325,1315,WN,846,N691,85,75,61,10,0,MDW,MCI,405,18,6,0,,0 +1996,6,5,3,829,830,1045,1045,US,2299,N341US,136,135,120,0,-1,DCA,MCO,759,4,12,0,,0 +1996,6,8,6,800,800,1055,1045,DL,199,N783DL,175,165,148,10,0,SJU,MCO,1189,4,23,0,,0 +1996,6,1,6,950,950,944,950,WN,276,N27,54,60,43,-6,0,SDF,MDW,271,4,7,0,,0 +1996,6,14,5,617,620,753,759,NW,473,N322US,96,99,72,-6,-3,ORD,MEM,491,5,19,0,,0 +1996,6,9,7,921,915,1242,1215,NW,997,N675MC,201,180,176,27,6,DTW,MIA,1145,4,21,0,,0 +1996,6,5,3,2014,2015,2144,2152,NW,950,N765NC,90,97,77,-8,-1,MEM,MKE,556,4,9,0,,0 +1996,6,11,2,1723,1725,1853,1904,NW,839,N916RW,150,159,137,-11,-2,CLT,MSP,930,2,11,0,,0 +1996,6,29,6,659,700,1143,1157,NW,710,N508US,164,177,142,-14,-1,LAS,MSP,1300,6,16,0,,0 +1996,6,20,4,837,840,1325,1334,NW,110,N286US,168,174,149,-9,-3,PHX,MSP,1276,5,14,0,,0 +1996,6,5,3,1245,1245,1344,1345,WN,21,N74,59,60,46,-1,0,HOU,MSY,303,2,11,0,,0 +1996,6,1,6,2115,2100,2215,2205,WN,709,N102,60,65,45,10,15,LAX,OAK,337,2,13,0,,0 +1996,6,4,2,845,845,930,930,WN,474,N60,45,45,31,0,0,DAL,OKC,181,5,9,0,,0 +1996,6,21,5,650,650,807,800,WN,973,N611,77,70,61,7,0,OAK,ONT,361,2,14,0,,0 +1996,6,9,7,2214,1947,14,2115,AA,293,N405AA,120,88,91,179,147,B,ORD,409,9,20,0,,0 +1996,6,30,7,1457,1500,1547,1553,UA,619,N7298U,110,113,88,-6,-3,DCA,ORD,612,8,14,0,,0 +1996,6,18,2,1742,1728,1844,1840,UA,373,N928UA,122,132,110,4,14,HPN,ORD,738,3,9,0,,0 +1996,6,21,5,807,803,937,921,AA,251,N553AA,90,78,61,16,4,MCI,ORD,403,12,17,0,,0 +1996,6,5,3,634,630,1155,1213,UA,686,N575UA,201,223,183,-18,4,PDX,ORD,1739,4,14,0,,0 +1996,6,28,5,632,633,1233,1230,AA,1758,N323AA,241,237,213,3,-1,SFO,ORD,1846,11,17,0,,0 +1996,6,20,4,959,1000,1045,1052,US,868,N237US,46,52,36,-7,-1,PHL,ORF,211,2,8,0,,0 +1996,6,7,5,710,710,837,844,AS,523,N940AS,87,94,77,-7,0,OAK,PDX,543,3,7,0,,0 +1996,6,24,1,2049,1705,2206,1820,US,772,N390US,77,75,62,226,224,CLE,PHL,363,6,9,0,,0 +1996,6,21,5,,715,,1005,US,594,UNKNOW,,110,,,,ORD,PHL,678,0,0,1,,0 +1996,6,10,1,1346,1345,1520,1513,AA,1117,N580AA,154,148,116,7,1,ATL,DFW,732,20,18,0,,0 +1996,6,20,4,1116,1120,1309,1325,AA,1395,N481AA,173,185,152,-16,-4,DCA,DFW,1192,9,12,0,,0 +1996,6,4,2,1229,1233,1553,1615,AA,542,N5CWAA,144,162,124,-22,-4,JAC,DFW,1046,8,12,0,,0 +1996,6,13,4,917,920,1140,1148,NW,409,N90S,143,148,112,-8,-3,MSP,DFW,852,14,17,0,,0 +1996,6,10,1,1443,1445,1940,1931,AA,1820,N5BPAA,177,166,153,9,-2,SAN,DFW,1171,11,13,0,,0 +1996,6,22,6,1506,1510,1552,1554,NW,1435,N930RC,46,44,27,-2,-4,MSP,DLH,144,7,12,0,,0 +1996,6,14,5,1848,1815,2327,2255,UA,504,N305UA,159,160,137,32,33,DEN,DTW,1123,8,14,0,,0 +1996,6,27,4,1102,1105,1256,1310,NW,430,N782NC,54,65,43,-14,-3,MDW,DTW,229,5,6,0,,0 +1996,6,3,1,959,1000,1235,1249,NW,1109,N321US,156,169,133,-14,-1,RSW,DTW,1085,9,14,0,,0 +1996,6,13,4,1412,1355,1428,1415,WN,1225,N304,76,80,67,13,17,SAT,ELP,496,2,7,0,,0 +1996,6,26,3,901,900,1324,1325,CO,274,N17317,203,205,185,-1,1,DFW,EWR,1372,7,11,0,,0 +1996,6,18,2,1707,1644,2026,1948,UA,656,N1828U,139,124,114,38,23,ORD,EWR,719,6,19,0,,0 +1996,6,28,5,2042,2040,2302,2259,DL,1673,N720DA,140,139,116,3,2,CVG,FLL,932,4,20,0,,0 +1996,6,4,2,1706,1705,1806,1810,DL,1504,N331DL,60,65,47,-4,1,ATL,GNV,300,2,11,0,,0 +1996,6,8,6,832,830,1050,1053,UA,191,N1846U,318,323,302,-3,2,LAX,HNL,2556,3,13,0,,0 +1996,6,15,6,2150,2150,2248,2245,WN,1352,N346,58,55,41,3,0,MSY,HOU,303,2,15,0,,0 +1996,6,2,7,1715,1715,1846,1845,NW,1402,N756NW,91,90,60,1,0,DTW,IAD,383,9,22,0,,0 +1996,6,15,6,634,635,740,729,CO,1548,N14628,66,54,39,11,-1,CRP,IAH,201,7,20,0,,0 +1996,6,1,6,1315,1125,1418,1230,CO,1700,N69348,63,65,50,108,110,MFE,IAH,316,5,8,0,,0 +1996,6,12,3,1800,1800,1916,1909,CO,1835,N14839,136,129,107,7,0,TPA,IAH,787,5,24,0,,0 +1996,6,12,3,1845,1830,2212,2009,US,645,N814US,207,99,82,123,15,CLT,ISP,575,3,122,0,,0 +1996,6,4,2,1346,1300,2236,2124,UA,24,N609UA,350,324,328,72,46,LAX,JFK,2475,11,11,0,,0 +1996,6,16,7,2040,2040,2241,2244,US,609,N517AU,301,304,282,-3,0,BWI,LAS,2106,7,12,0,,0 +1996,6,1,6,1445,1445,1555,1600,WN,1288,N692,70,75,60,-5,0,OAK,LAS,407,2,8,0,,0 +1996,6,28,5,850,850,909,908,DL,1098,N526DA,79,78,59,1,0,SLC,LAS,368,6,14,0,,0 +1996,6,13,4,1250,1250,2054,2056,DL,1562,N723DA,304,306,282,-2,0,HNL,LAX,2556,6,16,0,,0 +1996,6,5,3,2014,2015,2132,2134,UA,2221,N904UA,78,79,60,-2,-1,OAK,LAX,337,10,8,0,,0 +1996,6,13,4,1130,1130,1250,1250,WN,1496,N90,80,80,57,0,0,PHX,LAX,370,15,8,0,,0 +1996,6,3,1,928,932,1142,1137,HP,202,N155AW,74,65,48,5,-4,PHX,ABQ,328,11,15,0,,0 +1996,6,29,6,2011,2012,2137,2132,AS,56,N740AS,86,80,75,5,-1,OTZ,ANC,549,4,7,0,,0 +1996,6,29,6,1344,1335,1437,1443,DL,1245,N906DL,53,68,38,-6,9,CLT,ATL,227,8,7,0,,0 +1996,6,19,3,1301,1255,1443,1444,DL,1724,N113DA,102,109,79,-1,6,FLL,ATL,581,6,17,0,,0 +1996,6,24,1,1252,1250,1418,1416,DL,633,N790DL,86,86,67,2,2,MCO,ATL,403,13,6,0,,0 +1996,6,10,1,2109,2105,2302,2309,US,1103,N977VJ,113,124,96,-7,4,PHL,ATL,665,3,14,0,,0 +1996,6,23,7,1359,1355,1554,1600,DL,780,N502DA,115,125,102,-6,4,SYR,ATL,793,4,9,0,,0 +1996,6,21,5,905,905,1126,1114,TW,565,N931L,141,129,95,12,0,STL,AUS,722,4,42,0,,0 +1996,6,28,5,919,925,1006,1010,DL,1682,N332DL,47,45,34,-4,-6,JAN,BHM,211,3,10,0,,0 +1996,6,22,6,1640,1645,1800,1812,AA,572,N2CHAA,80,87,64,-12,-5,ORD,B,409,4,12,0,,0 +1996,6,5,3,1421,1414,1857,1850,AA,1928,N531AA,216,216,198,7,7,DFW,BOS,1562,5,13,0,,0 +1996,6,5,3,833,830,936,944,US,326,N265AU,63,74,46,-8,3,PHL,BOS,280,5,12,0,,0 +1996,6,26,3,2000,2000,2053,2055,WN,289,N513,53,55,39,-2,0,LAS,BUR,223,3,11,0,,0 +1996,6,28,5,1921,1905,2048,2031,DL,1883,N670DN,87,86,67,17,16,CVG,BWI,430,4,16,0,,0 +1996,6,15,6,2141,2130,2215,2204,US,100,N528AU,34,34,19,11,11,CLT,CAE,88,4,11,0,,0 +1996,6,1,6,958,1000,1112,1120,CO,1648,N27610,74,80,62,-8,-2,GSO,CLE,381,3,9,0,,0 +1996,6,9,7,932,935,1142,1145,US,994,N481US,70,70,58,-3,-3,BHM,CLT,351,7,5,0,,0 +1996,6,13,4,1645,1643,1735,1735,US,353,N483US,50,52,41,0,2,ILM,CLT,185,3,6,0,,0 +1996,6,10,1,652,635,804,740,US,755,N887US,72,65,60,24,17,RIC,CLT,256,3,9,0,,0 +1996,6,26,3,1950,1950,2215,2228,NW,877,N93S,85,98,72,-13,0,MEM,CMH,518,6,7,0,,0 +1996,6,19,3,1647,1650,1741,1747,DL,1179,N902DL,54,57,39,-6,-3,CLE,CVG,221,5,10,0,,0 +1996,6,22,6,1449,1450,2110,2119,DL,1038,N918DE,201,209,187,-9,-1,PHX,CVG,1569,3,11,0,,0 +1996,6,16,7,1730,1730,1820,1825,WN,48,N62,50,55,41,-5,0,HOU,DAL,239,4,5,0,,0 +1996,6,2,7,1454,1440,1611,1559,US,1615,N270AU,77,79,61,12,14,BDL,DCA,313,5,11,0,,0 +1996,6,24,1,621,625,737,750,US,2299,N354US,76,85,60,-13,-4,MHT,DCA,407,7,9,0,,0 +1996,6,30,7,709,700,746,739,UA,305,N1825U,37,39,20,7,9,COS,DEN,72,4,13,0,,0 +1996,6,3,1,1340,1340,1548,1549,UA,1221,N586UA,248,249,224,-1,0,MIA,DEN,1709,4,20,0,,0 +1996,6,4,2,2018,2020,2133,2143,DL,870,N136DL,75,83,50,-10,-2,SLC,DEN,391,5,20,0,,0 +1996,7,19,5,1012,1015,1115,1117,HP,98,N164AW,63,62,44,-2,-3,LAS,PHX,256,5,14,0,,0 +1996,7,30,2,1330,1330,1433,1435,WN,628,N696,63,65,52,-2,0,ONT,PHX,325,4,7,0,,0 +1996,7,19,5,2020,2020,2126,2126,HP,92,N168AW,66,66,52,0,0,S,PHX,338,5,9,0,,0 +1996,7,30,2,1219,1215,1257,1302,US,644,N899US,38,47,30,-5,4,CRW,PIT,164,4,4,0,,0 +1996,7,9,2,1039,1040,1247,1300,US,367,N981US,68,80,54,-13,-1,MKE,PIT,431,6,8,0,,0 +1996,7,31,3,928,930,1002,1007,DL,2043,N312DL,34,37,23,-5,-2,GEG,PSC,120,2,9,0,,0 +1996,7,1,1,,2105,,2219,US,1734,UNKNOW,,74,,,,PHL,RDU,336,0,0,1,,0 +1996,7,16,2,2147,2150,2236,2245,US,1898,N265AU,49,55,34,-9,-3,PIT,ROA,219,5,10,0,,0 +1996,7,5,5,946,945,1031,1048,CO,471,N92874,165,183,152,-17,1,IAH,SAN,1303,4,9,0,,0 +1996,7,3,3,1241,1145,1357,1305,WN,489,N314,76,80,66,52,56,SMF,SAN,480,2,8,0,,0 +1996,7,20,6,1340,1329,1436,1430,DL,1204,N658DL,56,61,35,6,11,ATL,SAV,215,5,16,0,,0 +1996,7,28,7,2050,2037,2302,2247,AS,547,N936AS,132,130,115,15,13,BUR,SEA,937,7,10,0,,0 +1996,7,11,4,2330,2235,111,14,AS,479,N773AS,101,99,83,57,55,OAK,SEA,671,5,13,0,,0 +1996,7,12,5,903,859,1052,1050,DL,217,N123DN,289,291,272,2,4,ATL,SFO,2139,6,11,0,,0 +1996,7,11,4,808,800,1116,1102,UA,809,N646UA,368,362,336,14,8,JFK,SFO,2586,10,22,0,,0 +1996,7,2,2,1337,1340,1518,1520,UA,2114,N316UA,101,100,87,-2,-3,PDX,SFO,550,3,11,0,,0 +1996,7,23,2,2129,2135,2217,2225,DL,1444,N986DL,48,50,35,-8,-6,JAN,SHV,220,5,8,0,,0 +1996,7,28,7,1134,1125,1214,1214,DL,944,N302WA,100,109,86,0,9,SLC,SJC,585,4,10,0,,0 +1996,7,17,3,1243,1235,1418,1408,AA,841,N2CFAA,155,153,139,10,8,DFW,SLC,988,3,13,0,,0 +1996,7,28,7,659,655,925,916,DL,915,N303WA,86,81,70,9,4,PSC,SLC,521,7,9,0,,0 +1996,7,1,1,2015,2015,2138,2140,WN,757,N608,83,85,65,-2,0,SAN,SMF,480,4,14,0,,0 +1996,7,17,3,1858,1900,2021,2020,HP,775,N169AW,83,80,70,1,-2,SMF,S,404,5,8,0,,0 +1996,7,9,2,1848,1848,2144,2150,TW,566,EI-CIW,116,122,89,-6,0,DEN,STL,770,9,18,0,,0 +1996,7,10,3,559,600,700,706,TW,250,N410EA,61,66,50,-6,-1,LIT,STL,296,5,6,0,,0 +1996,7,30,2,1000,945,1117,1057,TW,435,N64320,77,72,58,20,15,ORD,STL,258,8,11,0,,0 +1996,7,29,1,1825,1825,1904,1851,TW,589,N973Z,99,86,73,13,0,TYS,STL,405,21,5,0,,0 +1996,7,10,3,1625,1625,1714,1714,DL,807,N616DL,49,49,33,0,0,FLL,TPA,197,5,11,0,,0 +1996,7,12,5,2007,1955,2110,2042,UA,589,N976UA,123,107,96,28,12,DEN,TUS,639,4,23,0,,0 +1996,7,30,2,2202,2155,2314,2246,DL,471,N118DL,132,111,88,28,7,SLC,LAX,590,12,32,0,,0 +1996,7,28,7,1648,1640,1829,1823,US,2412,N815US,101,103,78,6,8,CLT,LGA,544,5,18,0,,0 +1996,7,4,4,1555,1600,1850,1906,AA,358,N402AA,115,126,98,-16,-5,ORD,LGA,733,5,12,0,,0 +1996,7,25,4,1805,1805,1854,1900,WN,784,N90,49,55,42,-6,0,AUS,MAF,294,2,5,0,,0 +1996,7,25,4,1557,1555,1708,1716,UA,761,N9022U,71,81,58,-8,2,ORD,MCI,403,4,9,0,,0 +1996,7,5,5,848,850,1122,1135,CO,300,N937MC,154,165,131,-13,-2,EWR,MCO,938,4,19,0,,0 +1996,7,6,6,2058,2100,2208,2216,NW,696,N93S,70,76,54,-8,-2,DTW,MDT,370,6,10,0,,0 +1996,7,18,4,2300,2235,2350,2325,WN,946,N83,50,50,40,25,25,STL,MDW,251,5,5,0,,0 +1996,7,9,2,1300,1300,1845,1904,NW,988,N512US,225,244,206,-19,0,SEA,MEM,1870,4,15,0,,0 +1996,7,13,6,830,830,1210,1127,CO,579,N579PE,220,177,168,43,0,EWR,MIA,1086,7,45,0,,0 +1996,7,3,3,1901,1830,2004,1942,NW,376,N529US,63,72,45,22,31,MSP,MKE,297,4,14,0,,0 +1996,7,22,1,844,845,1025,1023,NW,837,N925US,161,158,136,2,-1,CLT,MSP,930,4,21,0,,0 +1996,7,30,2,1659,1700,1834,1848,NW,397,N302RC,95,108,79,-14,-1,IND,MSP,503,6,10,0,,0 +1996,7,18,4,1727,1725,2043,1915,NW,711,N521US,256,170,169,88,2,PHL,MSP,980,6,81,0,,0 +1996,7,16,2,1736,1712,1916,1837,AA,2016,N717AA,100,85,78,39,24,DFW,MSY,448,3,19,0,,0 +1996,7,3,3,653,650,801,758,UA,2200,N304UA,68,68,51,3,3,LAX,OAK,337,4,13,0,,0 +1996,7,19,5,1853,1855,1927,1934,AA,161,N133AA,34,39,21,-7,-2,HNL,OGG,100,4,9,0,,0 +1996,7,8,1,1533,1535,1609,1628,DL,1470,N492DA,156,173,138,-19,-2,DFW,ONT,1189,3,15,0,,0 +1996,7,17,3,1836,1555,2025,1644,UA,1459,N7264U,169,109,143,221,161,ATL,ORD,606,5,21,0,,0 +1996,7,5,5,2024,2020,2027,2035,DL,2093,N903DE,63,75,39,-8,4,CVG,ORD,264,6,18,0,,0 +1996,7,23,2,656,700,819,818,CO,509,N12327,143,138,109,1,-4,EWR,ORD,719,7,27,0,,0 +1996,7,17,3,634,630,745,734,AA,303,N624AA,131,124,113,11,4,LGA,ORD,733,6,12,0,,0 +1996,7,1,1,1458,1500,1643,1618,UA,536,N9007U,105,78,53,25,-2,MSP,ORD,334,39,13,0,,0 +1996,7,7,7,1715,1715,1749,1757,UA,453,N9039U,94,102,83,-8,0,ROC,ORD,528,4,7,0,,0 +1996,7,11,4,1057,1056,1138,1145,UA,1473,N9001U,101,109,91,-7,1,SYR,ORD,607,3,7,0,,0 +1996,7,25,4,2123,2030,2258,2153,DL,1297,N652DL,275,263,260,65,53,CVG,PDX,1975,4,11,0,,0 +1996,7,11,4,1005,1005,1042,1050,WN,1052,N396,97,105,88,-8,0,SLC,PDX,630,3,6,0,,0 +1996,7,15,1,816,815,1239,1229,CO,1790,N17619,203,194,163,10,1,IAH,PHL,1324,5,35,0,,0 +1996,7,3,3,1844,1845,2203,2207,TW,108,N9404V,139,142,110,-4,-1,STL,PHL,813,4,25,0,,0 +1996,7,15,1,1429,1428,1635,1626,AA,1323,N2BA,126,118,102,9,1,B,DFW,631,12,12,0,,0 +1996,7,23,2,1717,1626,1956,1909,AA,1314,N2BEAA,99,103,78,47,51,ELP,DFW,551,11,10,0,,0 +1996,7,24,3,1455,1500,1731,1741,AA,25,N242AA,216,221,190,-10,-5,LGA,DFW,1389,6,20,0,,0 +1996,7,16,2,2040,2000,2253,2216,AA,2257,N410AA,133,136,105,37,40,ORD,DFW,802,11,17,0,,0 +1996,7,29,1,1339,1341,1943,1927,AA,963,N432AA,244,226,176,16,-2,SFO,DFW,1464,32,36,0,,0 +1996,7,6,6,1603,1605,1741,1745,NW,1521,N772NC,98,100,75,-4,-2,ALB,DTW,488,5,18,0,,0 +1996,7,1,1,1256,1300,1615,1600,NW,243,N754NW,199,180,154,15,-4,FLL,DTW,1127,33,12,0,,0 +1996,7,31,3,1826,1830,2131,2133,NW,608,N346NW,185,183,153,-2,-4,MIA,DTW,1145,14,18,0,,0 +1996,7,15,1,1013,1015,1733,1738,NW,344,N511US,260,263,235,-5,-2,SFO,DTW,2079,13,12,0,,0 +1996,7,8,1,1632,1500,1842,1718,CO,382,N13234,130,138,102,84,92,ATL,EWR,745,6,22,0,,0 +1996,7,31,3,1207,1205,1341,1343,NW,30,N610NW,94,98,75,-2,2,DTW,EWR,487,7,12,0,,0 +1996,7,23,2,1347,1315,1720,1603,CO,444,N14810,213,168,135,77,32,PBI,EWR,1024,14,64,0,,0 +1996,7,25,4,2045,2040,2302,2259,DL,1673,N495DA,137,139,124,3,5,CVG,FLL,932,2,11,0,,0 +1996,7,3,3,817,819,923,920,DL,1255,N382DL,66,61,50,3,-2,ATL,GNV,300,2,14,0,,0 +1996,7,7,7,1540,1545,1755,1815,NW,933,N151US,315,330,297,-20,-5,LAX,HNL,2556,4,14,0,,0 +1996,7,5,5,630,630,726,730,WN,708,N302,56,60,47,-4,0,MSY,HOU,303,2,7,0,,0 +1996,7,3,3,611,610,1109,1111,UA,1755,N7280U,178,181,161,-2,1,DEN,IAD,1452,6,11,0,,0 +1996,7,21,7,1154,1150,1339,1333,CO,1993,N15820,165,163,143,6,4,CLE,IAH,1091,5,17,0,,0 +1996,7,23,2,1052,1055,1321,1322,CO,619,N16806,209,207,188,-1,-3,LGA,IAH,1416,5,16,0,,0 +1996,7,12,5,1704,1700,2236,2244,CO,240,N16895,212,224,193,-8,4,SFO,IAH,1635,8,11,0,,0 +1996,7,9,2,751,744,843,836,UA,418,N7451U,52,52,38,7,7,ORD,IND,177,6,8,0,,0 +1996,7,13,6,1720,1610,1917,1754,TW,224,N9405T,117,104,86,83,70,DTW,JFK,508,10,21,0,,0 +1996,7,17,3,1115,1054,1156,1148,AS,63,N782AS,101,114,86,8,21,SEA,KTN,680,5,10,0,,0 +1996,7,10,3,1620,1616,1724,1714,UA,2162,N309UA,64,58,47,10,4,LAX,LAS,236,3,14,0,,0 +1996,7,21,7,645,645,746,749,HP,2085,N636AW,61,64,46,-3,0,SAN,LAS,258,3,12,0,,0 +1996,7,10,3,1012,1000,1128,1137,UA,1055,N392UA,136,157,118,-9,12,DEN,LAX,862,8,10,0,,0 +1996,7,13,6,1932,1930,2049,2037,HP,2045,N127AW,77,67,46,12,2,LAS,LAX,236,8,23,0,,0 +1996,7,2,2,2015,2015,2211,2227,UA,131,N416UA,236,252,213,-16,0,ORD,LAX,1745,7,16,0,,0 +1996,7,13,6,1251,1255,1323,1320,DL,1092,N369DL,32,25,20,3,-4,AVP,ABE,50,4,8,0,,0 +1996,7,25,4,2352,2300,34,2342,DL,2004,N920DL,42,42,28,52,52,ATL,AGS,143,3,11,0,,0 +1996,7,20,6,756,730,1255,1224,DL,1100,N934DL,179,174,161,31,26,ABQ,ATL,1269,4,14,0,,0 +1996,7,3,3,600,600,711,718,DL,889,N905DE,71,78,58,-7,0,DAY,ATL,432,5,8,0,,0 +1996,7,5,5,546,550,736,737,DL,506,N921DL,50,47,28,-1,-4,HSV,ATL,151,11,11,0,,0 +1996,7,6,6,701,700,906,858,AA,1503,N719AA,125,118,86,8,1,MIA,ATL,595,20,19,0,,0 +1996,7,31,3,2025,2000,2208,2133,US,1541,N946VJ,103,93,83,35,25,PIT,ATL,526,7,13,0,,0 +1996,7,3,3,1335,1325,1620,1619,DL,1917,N535DA,105,114,74,1,10,TUL,ATL,674,5,26,0,,0 +1996,7,27,6,1213,1215,1251,1303,NW,1795,N8907E,38,48,25,-12,-2,DTW,AZO,113,5,8,0,,0 +1996,7,8,1,1356,1345,1541,1526,UA,283,N9072U,105,101,81,15,11,ORD,BHM,584,3,21,0,,0 +1996,7,7,7,1155,1155,1225,1227,US,1256,N887US,90,92,74,-2,0,PIT,B,462,6,10,0,,0 +1996,7,25,4,1037,1040,1216,1229,NW,384,N318US,99,109,76,-13,-3,DTW,BOS,632,8,15,0,,0 +1996,7,10,3,1500,1500,1558,1610,US,1731,N928VJ,58,70,48,-12,0,PHL,BOS,280,4,6,0,,0 +1996,7,18,4,640,640,732,735,WN,568,N366,52,55,41,-3,0,LAS,BUR,223,2,9,0,,0 +1996,7,28,7,1551,1510,1707,1633,DL,282,N525DA,76,83,66,34,41,CVG,BWI,430,3,7,0,,0 +1996,7,17,3,2115,1950,2202,2045,DL,1796,N906DE,47,55,32,77,85,ATL,CAE,191,6,9,0,,0 +1996,7,29,1,1304,1300,1424,1432,CO,409,N70330,80,92,61,-8,4,EWR,CLE,404,4,15,0,,0 +1996,7,27,6,1016,1015,1124,1126,US,1682,N899US,68,71,42,-2,1,ATL,CLT,227,9,17,0,,0 +1996,7,18,4,1842,1844,1932,1920,US,615,N562AU,50,36,27,12,-2,GSP,CLT,75,18,5,0,,0 +1996,7,21,7,1443,1430,1615,1550,US,765,N802US,92,80,65,25,13,PIT,CLT,366,9,18,0,,0 +1996,7,15,1,1946,1850,2131,2035,HP,2990,N621AW,105,105,79,56,56,EWR,CMH,462,6,20,0,,0 +1996,7,17,3,1320,1320,1509,1508,DL,697,N506DA,109,108,95,1,0,ALB,CVG,623,4,10,0,,0 +1996,7,4,4,1441,1440,1718,1722,NW,1426,N3312L,97,102,81,-4,1,MSP,CVG,596,6,10,0,,0 +1996,7,16,2,1805,1805,1856,1855,WN,136,N512,51,50,33,1,0,AUS,DAL,189,3,15,0,,0 +1996,7,2,2,1427,1426,1755,1752,AA,1636,N2BGAA,148,146,115,3,1,DFW,DAY,861,8,25,0,,0 +1996,7,18,4,818,820,1221,1219,CO,532,N16892,183,179,158,2,-2,IAH,DCA,1208,2,23,0,,0 +1996,7,30,2,626,625,736,732,UA,1762,N7272U,70,67,54,4,1,ABQ,DEN,349,6,10,0,,0 +1996,7,26,5,1639,1640,1656,1701,UA,395,N399UA,77,81,64,-5,-1,ICT,DEN,419,4,9,0,,0 +1996,7,28,7,1825,1720,2105,2005,HP,2491,N328AW,100,105,79,60,65,PHX,DEN,602,11,10,0,,0 +1996,8,14,3,1137,1135,1215,1220,UA,419,N551UA,98,105,82,-5,2,DEN,PHX,602,3,13,0,,0 +1996,8,5,1,700,700,808,810,WN,603,N603,68,70,55,-2,0,LAX,PHX,370,4,9,0,,0 +1996,8,5,1,815,815,910,915,WN,1106,N385,55,60,48,-5,0,SAN,PHX,304,2,5,0,,0 +1996,8,5,1,912,915,1101,1052,US,388,N856US,109,97,82,9,-3,ATL,PIT,526,3,24,0,,0 +1996,8,11,7,1233,1230,1459,1504,US,417,N824US,146,154,130,-5,3,FLL,PIT,994,6,10,0,,0 +1996,8,27,2,1750,1740,1854,1852,US,478,N255AU,64,72,51,2,10,RIC,PIT,259,6,7,0,,0 +1996,8,27,2,1210,1205,1318,1319,CO,1982,N14381,68,74,46,-1,5,EWR,PWM,284,4,18,0,,0 +1996,8,29,4,839,755,920,835,DL,806,N296WA,41,40,25,45,44,RDU,RIC,139,5,11,0,,0 +1996,8,28,3,1135,1139,1229,1242,AA,893,N2CUAA,54,63,42,-13,-4,ORD,RST,268,3,9,0,,0 +1996,8,15,4,1520,1520,1726,1733,UA,731,N330UA,246,253,224,-7,0,ORD,SAN,1723,3,19,0,,0 +1996,8,7,3,1056,1059,1201,1159,AA,739,N279AA,65,60,43,2,-3,DFW,SAT,247,3,19,0,,0 +1996,8,8,4,1945,1905,2020,1944,DL,1080,N906DE,35,39,20,36,40,CVG,SDF,83,7,8,0,,0 +1996,8,13,2,1750,1730,1842,1821,AS,594,N977AS,52,51,41,21,20,GEG,SEA,224,3,8,0,,0 +1996,8,15,4,1748,1740,2205,1946,US,115,N617AU,437,306,276,139,8,PIT,SEA,2125,5,156,0,,0 +1996,8,21,3,2030,2000,2158,2125,UA,509,N528UA,148,145,123,33,30,DEN,SFO,967,9,16,0,,0 +1996,8,1,4,1433,1432,1541,1549,UA,2046,N377UA,68,77,50,-8,1,LAX,SFO,337,7,11,0,,0 +1996,8,22,4,1052,1033,1153,1128,UA,2396,N366UA,61,55,50,25,19,RNO,SFO,192,2,9,0,,0 +1996,8,24,6,1017,1015,1138,1146,DL,1573,N915DE,201,211,181,-8,2,DFW,SJC,1438,5,15,0,,0 +1996,8,9,5,827,815,1256,1203,AA,1137,N084AA,269,228,209,53,12,JFK,SJU,1597,7,53,0,,0 +1996,8,9,5,1908,1850,2124,2103,DL,1939,N308WA,76,73,56,21,18,LAS,SLC,368,6,14,0,,0 +1996,8,20,2,639,640,859,905,DL,736,N420DA,80,85,65,-6,-1,SMF,SLC,532,4,11,0,,0 +1996,8,21,3,1734,1735,1906,1905,DL,1445,N656DL,272,270,233,1,-1,ATL,S,1919,7,32,0,,0 +1996,8,1,4,1738,1739,1821,1830,DL,773,N919DL,103,111,71,-9,-1,ATL,STL,483,5,27,0,,0 +1996,8,26,1,1854,1855,1932,1936,NW,1447,N759NW,98,101,77,-4,-1,DTW,STL,440,10,11,0,,0 +1996,8,15,4,1501,1435,1600,1530,WN,1078,N528,59,55,43,30,26,MCI,STL,237,3,13,0,,0 +1996,8,27,2,1642,1645,2143,2142,TW,391,N9305N,181,177,152,1,-3,PHX,STL,1262,19,10,0,,0 +1996,8,22,4,1520,1515,1657,1650,DL,335,N328DL,97,95,75,7,5,CVG,SYR,527,4,18,0,,0 +1996,8,2,5,701,700,945,944,DL,315,N967DL,164,164,143,1,1,LGA,TPA,1011,3,18,0,,0 +1996,8,21,3,2147,2150,2305,2312,AA,1711,N433AA,198,202,180,-7,-3,ORD,TUS,1437,5,13,0,,0 +1996,8,25,7,1806,1805,2006,1951,DL,807,N633DL,300,286,278,15,1,TPA,LAX,2158,7,15,0,,0 +1996,8,13,2,1034,1031,1607,1600,UA,404,N553UA,213,209,192,7,3,DEN,LGA,1619,4,17,0,,0 +1996,8,15,4,1300,1300,1602,1555,UA,896,N415UA,122,115,98,7,0,ORD,LGA,733,3,21,0,,0 +1996,8,15,4,,2116,,2312,UA,464,UNKNOW,,56,,,,ORD,MBS,222,0,0,1,,0 +1996,8,17,6,938,900,1056,1012,TW,111,N927L,78,72,44,44,38,STL,MCI,237,3,31,0,,0 +1996,8,21,3,741,745,942,950,US,1689,N351US,121,125,101,-8,-4,IAD,MCO,758,4,16,0,,0 +1996,8,2,5,1830,1830,1943,1945,WN,1857,N721,73,75,61,-2,0,B,MDW,395,3,9,0,,0 +1996,8,23,5,1109,1115,1245,1252,NW,779,N942N,96,97,81,-7,-6,AUS,MEM,559,4,11,0,,0 +1996,8,10,6,1545,1546,1742,1717,AA,1897,N2BPAA,117,91,94,25,-1,DFW,MFE,468,4,19,0,,0 +1996,8,11,7,1229,1230,1514,1529,AA,1819,N052AA,165,179,141,-15,-1,JFK,MIA,1090,3,21,0,,0 +1996,8,7,3,1559,1600,1716,1712,TW,526,N996Z,77,72,49,4,-1,STL,MKE,317,5,23,0,,0 +1996,8,2,5,,740,,830,NW,409,N612NW,,110,,,,DAY,MSP,574,0,0,1,,0 +1996,8,28,3,1900,1905,2100,2100,NW,371,N330NW,180,175,149,0,-5,LGA,MSP,1020,9,22,0,,0 +1996,8,8,4,1445,1440,1718,1701,NW,1256,N942N,93,81,75,17,5,RAP,MSP,490,6,12,0,,0 +1996,8,24,6,1712,1700,1806,1800,WN,361,N524,54,60,45,6,12,HOU,MSY,303,2,7,0,,0 +1996,8,18,7,1943,1930,2049,2040,WN,865,N686,66,70,57,9,13,LAX,OAK,337,4,5,0,,0 +1996,8,7,3,1320,1320,1401,1405,WN,138,N702,41,45,31,-4,0,DAL,OKC,181,4,6,0,,0 +1996,8,31,6,1215,1215,1301,1305,WN,1841,N627,46,50,31,-4,0,LAS,ONT,197,2,13,0,,0 +1996,8,21,3,1639,1640,1921,1915,AA,2085,N2DEAA,162,155,146,6,-1,AUS,ORD,978,7,9,0,,0 +1996,8,2,5,831,800,825,807,UA,465,N9063U,54,67,40,18,31,DAY,ORD,240,7,7,0,,0 +1996,8,24,6,1039,1030,1155,1136,UA,645,N1843U,136,126,105,19,9,EWR,ORD,719,9,22,0,,0 +1996,8,2,5,1102,1100,1222,1210,AA,321,N550AA,140,130,109,12,2,LGA,ORD,733,11,20,0,,0 +1996,8,13,2,2007,2000,2121,2123,UA,1160,N978UA,74,83,53,-2,7,MSP,ORD,334,4,17,0,,0 +1996,8,13,2,1112,1117,1211,1219,AA,844,N2BMAA,59,62,43,-8,-5,RST,ORD,268,7,9,0,,0 +1996,8,19,1,1000,1000,1133,1133,UA,497,N559UA,153,153,130,0,0,TPA,ORD,1012,10,13,0,,0 +1996,8,1,4,2006,2005,2141,2133,UA,725,N506UA,155,148,137,8,1,DEN,PDX,992,3,15,0,,0 +1996,8,7,3,1405,1405,1520,1530,WN,1555,N606,75,85,67,-10,0,SMF,PDX,479,2,6,0,,0 +1996,8,20,2,1727,1725,1827,1825,UA,1108,N982UA,60,60,42,2,2,IAD,PHL,134,4,14,0,,0 +1996,8,3,6,1416,1415,1630,1645,US,821,N280AU,134,150,122,-15,1,SRQ,PHL,956,5,7,0,,0 +1996,8,21,3,652,655,847,845,AA,1215,N450AA,115,110,93,2,-3,BHM,DFW,597,8,14,0,,0 +1996,8,12,1,1947,1905,2109,2049,NW,1417,N505US,142,164,127,20,42,DTW,DFW,987,5,10,0,,0 +1996,8,13,2,1913,1915,5,13,AA,1804,N549AA,172,178,137,-8,-2,LAX,DFW,1235,8,27,0,,0 +1996,8,19,1,858,900,1116,1114,AA,2213,N278AA,138,134,105,2,-2,ORD,DFW,802,13,20,0,,0 +1996,8,28,3,723,726,1312,1319,AA,432,N463AA,229,233,194,-7,-3,SEA,DFW,1660,16,19,0,,0 +1996,8,8,4,2231,2210,2329,2317,UA,571,N316UA,58,67,43,12,21,ORD,DSM,299,5,10,0,,0 +1996,8,10,6,1648,1650,1925,1926,NW,497,N8903E,97,96,81,-1,-2,DSM,DTW,534,7,9,0,,0 +1996,8,9,5,1410,1410,1609,1610,WN,901,N691,59,60,41,-1,0,MDW,DTW,229,5,13,0,,0 +1996,8,20,2,621,625,859,815,NW,1438,N3310L,98,50,67,44,-4,SBN,DTW,157,5,26,0,,0 +1996,8,17,6,1813,1730,1851,1808,US,850,N927VJ,38,38,24,43,43,PIT,ERI,109,6,8,0,,0 +1996,8,31,6,1754,1540,2338,2005,AA,1008,N878AA,284,205,180,213,134,DFW,EWR,1372,25,79,0,,0 +1996,8,4,7,1020,1020,1329,1325,CO,356,N16232,129,125,98,4,0,ORD,EWR,719,6,25,0,,0 +1996,8,5,1,1124,1120,1330,1306,NW,1802,N986US,186,166,157,24,4,MSP,FCA,1026,4,25,0,,0 +1996,8,27,2,1336,1259,1434,1349,AS,305,N941AS,58,50,39,45,37,SEA,GEG,224,2,17,0,,0 +1996,8,26,1,1613,1610,1756,1808,US,248,N526AU,103,118,87,-12,3,LGA,GSP,610,3,13,0,,0 +1996,8,11,7,2205,2205,2252,2255,WN,713,N504,47,50,39,-3,0,HRL,HOU,276,3,5,0,,0 +1996,8,31,6,1510,1510,1614,1625,UA,1195,N953UA,64,75,49,-11,0,BDL,IAD,326,7,8,0,,0 +1996,8,1,4,1839,1840,1927,1925,CO,1711,N13891,48,45,33,2,-1,AUS,IAH,140,4,11,0,,0 +1996,8,4,7,943,945,1432,1442,CO,1936,N35832,169,177,147,-10,-2,LAS,IAH,1222,5,17,0,,0 +1996,8,18,7,1512,1515,1639,1642,CO,1757,N14325,87,87,71,-3,-3,PNS,IAH,489,5,11,0,,0 +1996,8,29,4,1309,1310,1522,1523,CO,1682,N27610,133,133,110,-1,-1,IAH,IND,845,7,16,0,,0 +1996,8,19,1,1016,1015,1327,1324,TW,494,N408EA,131,129,98,3,1,STL,JAX,753,4,29,0,,0 +1996,8,30,5,1725,1645,2050,2015,TW,66,N651TW,145,150,126,35,40,STL,JFK,892,8,11,0,,0 +1996,8,13,2,39,2355,233,201,DL,415,N665DN,294,306,278,32,44,JFK,LAS,2248,4,12,0,,0 +1996,8,10,6,615,615,710,710,WN,117,N300,55,55,46,0,0,PHX,LAS,256,2,7,0,,0 +1996,8,9,5,1942,1935,2115,2120,DL,1085,N138DL,273,285,242,-5,7,ATL,LAX,1946,9,22,0,,0 +1996,8,26,1,1800,1800,2102,2048,AA,21,N129AA,362,348,312,14,0,JFK,LAX,2475,8,42,0,,0 +1996,8,20,2,1435,1430,1540,1545,WN,1487,N664,65,75,54,-5,5,OAK,LAX,337,5,6,0,,0 +1996,8,6,2,904,904,1124,1133,AS,256,N953AS,140,149,126,-9,0,SEA,LAX,954,3,11,0,,0 +1996,8,26,1,1443,1443,1646,1649,HP,2205,N166AW,63,66,48,-3,0,PHX,ABQ,328,4,11,0,,0 +1996,8,26,1,2019,2005,2332,2324,UA,1833,N591UA,373,379,360,8,14,ORD,ANC,2846,4,9,0,,0 +1996,8,19,1,916,915,1103,1055,DL,1107,N908DE,107,100,86,8,1,CLE,ATL,554,7,14,0,,0 +1996,8,1,4,1350,1335,1610,1543,DL,775,N908DE,140,128,109,27,15,EWR,ATL,745,10,21,0,,0 +1996,8,13,2,1320,1320,1543,1550,DL,1598,N917DE,83,90,64,-7,0,LIT,ATL,453,9,10,0,,0 +1996,8,19,1,908,907,1055,1045,DL,705,N790DL,107,98,90,10,1,PBI,ATL,545,4,13,0,,0 +1996,8,9,5,1435,1440,1608,1608,DL,1126,N913DE,93,88,80,0,-5,SRQ,ATL,445,3,10,0,,0 +1996,8,2,5,1408,1410,1546,1551,NW,1032,N919RW,98,101,79,-5,-2,MEM,AUS,559,4,15,0,,0 +1996,8,19,1,2221,2110,2300,2144,DL,224,N290WA,39,34,26,76,71,PWM,BGR,109,6,7,0,,0 +1996,8,11,7,1310,1310,1447,1455,WN,1263,N61,97,105,85,-8,0,HOU,B,670,2,10,0,,0 +1996,8,27,2,1501,1505,1657,1659,HP,2828,N185AW,116,114,96,-2,-4,CMH,BOS,640,7,13,0,,0 +1996,8,1,4,1630,1620,2022,1928,DL,958,N990DL,232,188,207,54,10,MIA,BOS,1258,9,16,0,,0 +1996,8,10,6,956,940,1138,1118,US,1212,N823US,102,98,75,20,16,CLT,BUF,546,4,23,0,,0 +1996,8,15,4,1932,1910,2107,2047,DL,390,N910DE,95,97,77,20,22,ATL,BWI,576,4,14,0,,0 +1996,8,28,3,657,700,744,753,US,1177,N245US,47,53,35,-9,-3,ORF,BWI,159,4,8,0,,0 +1996,8,29,4,633,635,831,824,CO,155,N17321,118,109,100,7,-2,BOS,CLE,563,4,14,0,,0 +1996,8,17,6,2045,2020,2245,2229,UA,808,N1831U,60,69,42,16,25,ORD,CLE,316,4,14,0,,0 +1996,8,9,5,857,900,1011,1015,US,1758,N802US,74,75,57,-4,-3,DAY,CLT,370,3,14,0,,0 +1996,8,1,4,1237,1220,1434,1418,US,538,N608AU,117,118,98,16,17,MIA,CLT,650,6,13,0,,0 +1996,8,7,3,1243,1240,1428,1412,US,59,N632AU,105,92,88,16,3,TPA,CLT,508,7,10,0,,0 +1996,8,13,2,1229,1230,1307,1304,UA,1043,N519UA,38,34,18,3,-1,DEN,COS,72,7,13,0,,0 +1996,8,6,2,1351,1330,1527,1518,DL,1415,N519DA,96,108,70,9,21,EWR,CVG,569,10,16,0,,0 +1996,8,4,7,1544,1545,1729,1738,DL,1202,N330DL,45,53,34,-9,-1,SBN,CVG,203,4,7,0,,0 +1996,8,2,5,2100,2100,2152,2155,WN,1025,N360,52,55,42,-3,0,LBB,DAL,293,2,8,0,,0 +1996,8,28,3,753,755,911,914,US,1178,N340US,78,79,62,-3,-2,CHS,DCA,444,7,9,0,,0 +1996,8,17,6,1819,1820,2131,2142,NW,1767,N518US,132,142,112,-11,-1,MSP,DCA,931,4,16,0,,0 +1996,8,23,5,917,915,1012,953,DL,1585,N534DA,175,158,142,19,2,CVG,DEN,1069,5,28,0,,0 +1996,8,30,5,1425,1425,1620,1634,UA,1607,N580UA,235,249,218,-14,0,MIA,DEN,1709,5,12,0,,0 +1996,8,25,7,1604,1605,1925,1927,UA,1058,N373UA,141,142,127,-2,-1,SJC,DEN,948,5,9,0,,0 +1996,9,11,3,730,730,735,740,WN,760,N300,65,70,53,-5,0,ELP,PHX,347,4,8,0,,0 +1996,9,13,5,2035,2020,2202,2131,NW,107,N321US,207,191,186,31,15,MSP,PHX,1276,4,17,0,,0 +1996,9,1,7,2003,2005,2033,2038,DL,469,N644DL,90,93,71,-5,-2,SLC,PHX,507,4,15,0,,0 +1996,9,15,7,748,750,827,833,US,317,N423US,39,43,22,-6,-2,CLE,PIT,105,8,9,0,,0 +1996,9,12,4,1033,1035,1343,1332,US,700,N531AU,130,117,115,11,-2,MCI,PIT,773,6,9,0,,0 +1996,9,29,7,1928,1823,2158,2044,US,1216,N446US,150,141,111,74,65,TPA,PIT,873,6,33,0,,0 +1996,9,16,1,717,720,856,855,US,1057,N972VJ,99,95,69,1,-3,LGA,RDU,431,4,26,0,,0 +1996,9,27,5,1828,1820,1843,1841,DL,1624,N469DA,75,81,55,2,8,SLC,RNO,422,6,14,0,,0 +1996,9,11,3,927,930,1115,1112,NW,285,N302US,288,282,260,3,-3,DTW,SAN,1957,2,26,0,,0 +1996,9,24,2,1819,1810,1905,1858,DL,1895,N3301,106,108,89,7,9,SLC,SAN,626,2,15,0,,0 +1996,9,12,4,1730,1720,1840,1821,DL,1471,N538DA,70,61,39,19,10,ATL,SAV,215,6,25,0,,0 +1996,9,29,7,1551,1500,1719,1629,UA,1420,N7266U,148,149,130,50,51,DEN,SEA,1024,4,14,0,,0 +1996,9,28,6,630,630,715,717,AS,95,N763AS,45,47,29,-2,0,PDX,SEA,129,4,12,0,,0 +1996,9,2,1,1305,1225,1512,1451,US,57,N526AU,307,326,291,21,40,CLT,SFO,2296,6,10,0,,0 +1996,9,18,3,1430,1432,1545,1549,UA,2046,N385UA,75,77,55,-4,-2,LAX,SFO,337,3,17,0,,0 +1996,9,1,7,1832,1835,1945,2000,UA,2356,N927UA,73,85,63,-15,-3,SAN,SFO,447,2,8,0,,0 +1996,9,2,1,1710,1710,1805,1810,WN,1277,N380,55,60,43,-5,0,LAX,SJC,308,5,7,0,,0 +1996,9,27,5,1735,1730,1912,1857,DL,947,N297WA,97,87,75,15,5,ABQ,SLC,493,7,15,0,,0 +1996,9,8,7,812,815,1044,1037,DL,1137,N527DA,212,202,196,7,-3,MSY,SLC,1428,6,10,0,,0 +1996,9,9,1,1546,1515,1707,1635,WN,1714,N384,81,80,64,32,31,LAS,SMF,397,3,14,0,,0 +1996,9,19,4,1855,1836,2011,1948,HP,10,N315AW,76,72,50,23,19,PHX,S,338,4,22,0,,0 +1996,9,15,7,1830,1830,1906,1858,TW,211,EI-CIW,96,88,72,8,0,CMH,STL,410,10,14,0,,0 +1996,9,16,1,803,805,1029,933,TW,656,N925L,146,88,90,56,-2,JAN,STL,444,5,51,0,,0 +1996,9,9,1,1910,1910,2014,2021,TW,636,N84355,64,71,52,-7,0,OMA,STL,342,4,8,0,,0 +1996,9,28,6,753,755,903,905,TW,62,N64319,70,70,51,-2,-2,TUL,STL,351,10,9,0,,0 +1996,9,24,2,1235,1220,1517,1504,CO,437,N15841,162,164,130,13,15,EWR,TPA,998,3,29,0,,0 +1996,9,23,1,2024,2025,2107,2112,UA,589,N364UA,103,107,88,-5,-1,DEN,TUS,639,6,9,0,,0 +1996,9,12,4,1814,1810,1929,1929,UA,2775,N382UA,75,79,53,0,4,SFO,LAX,337,11,11,0,,0 +1996,9,9,1,1051,1020,1217,1144,CO,1126,N63305,86,84,66,33,31,CLE,LGA,418,7,13,0,,0 +1996,9,29,7,,930,,1302,NW,504,N309RC,,152,,,,MSP,LGA,1020,0,0,1,,0 +1996,9,26,4,,1125,,1243,TW,619,N490SA,,78,,,,STL,LNK,370,0,0,1,,0 +1996,9,26,4,820,815,1006,931,UA,637,N7290U,106,76,70,35,5,ORD,MCI,403,3,33,0,,0 +1996,9,13,5,951,925,1237,1208,CO,607,N15820,166,163,129,29,26,EWR,MCO,938,7,30,0,,0 +1996,9,16,1,1840,1840,2008,2010,WN,625,N359,88,90,82,-2,0,BHM,MDW,570,2,4,0,,0 +1996,9,2,1,1113,1115,1248,1252,NW,779,N921RW,95,97,81,-4,-2,AUS,MEM,559,4,10,0,,0 +1996,9,13,5,2013,2015,2115,2120,CO,1917,N17533,62,65,46,-5,-2,IAH,MFE,316,5,11,0,,0 +1996,9,23,1,1329,1330,1618,1617,AA,463,N705AA,169,167,143,1,-1,LGA,MIA,1097,8,18,0,,0 +1996,9,18,3,1325,1325,1329,1330,DL,1905,N908DE,64,65,44,-1,0,ATL,MOB,302,6,14,0,,0 +1996,9,29,7,558,600,635,644,NW,1252,N8903E,37,44,28,-9,-2,DLH,MSP,144,3,6,0,,0 +1996,9,18,3,528,530,644,649,NW,1280,N8978E,76,79,67,-5,-2,MOT,MSP,449,4,5,0,,0 +1996,9,28,6,627,630,756,801,NW,1045,N926RC,89,91,69,-5,-3,STL,MSP,449,9,11,0,,0 +1996,9,28,6,1013,1014,1201,1204,TW,185,N412EA,108,110,94,-3,-1,STL,MSY,604,4,10,0,,0 +1996,9,27,5,1413,1405,1525,1525,WN,833,N307,72,80,63,0,8,SAN,OAK,446,2,7,0,,0 +1996,9,29,7,1644,1630,1757,1750,WN,945,N351,73,80,66,7,14,MDW,OMA,423,2,5,0,,0 +1996,9,27,5,956,1000,1103,1110,WN,1709,N348,67,70,57,-7,-4,SMF,ONT,389,3,7,0,,0 +1996,9,16,1,1646,1645,1707,1706,UA,129,N510UA,81,81,54,1,1,CLE,ORD,316,8,19,0,,0 +1996,9,2,1,1857,1900,1856,1915,NW,1187,N941N,59,75,42,-19,-3,DTW,ORD,235,5,12,0,,0 +1996,9,26,4,1230,1200,1849,1801,AA,1576,N521AA,259,241,226,48,30,LAX,ORD,1745,7,26,0,,0 +1996,9,9,1,1946,1900,2048,2014,NW,144,N817EA,62,74,46,34,46,MSP,ORD,334,7,9,0,,0 +1996,9,11,3,716,716,801,756,AA,1861,N456AA,105,100,81,5,0,ROC,ORD,528,8,16,0,,0 +1996,9,28,6,1327,1333,1510,1514,AA,1912,N818AA,103,101,82,-4,-6,TUL,ORD,585,11,10,0,,0 +1996,9,17,2,1755,1755,1852,1857,AS,424,N977AS,57,62,40,-5,0,GEG,PDX,279,3,14,0,,0 +1996,9,23,1,1933,1930,2126,2129,DL,1928,N624DL,113,119,90,-3,3,ATL,PHL,665,5,18,0,,0 +1996,9,13,5,1121,1120,1444,1450,US,298,N850US,143,150,131,-6,1,MCI,PHL,1038,4,8,0,,0 +1996,9,10,2,2045,2045,2050,2050,WN,525,N319,65,65,54,0,0,ABQ,PHX,328,4,7,0,,0 +1996,9,27,5,1234,1232,1526,1453,AA,1903,N278AA,232,201,203,33,2,BWI,DFW,1217,10,19,0,,0 +1996,9,21,6,1157,1201,1330,1332,AA,1274,N2BFAA,93,91,77,-2,-4,HRL,DFW,461,9,7,0,,0 +1996,9,5,4,720,720,848,850,DL,691,N981DL,148,150,130,-2,0,MCO,DFW,984,7,11,0,,0 +1996,9,19,4,1243,1208,1654,1629,AA,48,N5CBAA,131,141,110,25,35,PHX,DFW,868,10,11,0,,0 +1996,9,14,6,842,846,1334,1336,AA,1376,N610AA,172,170,146,-2,-4,S,DFW,1205,15,11,0,,0 +1996,9,2,1,1848,1850,1953,1940,NW,1106,N8957E,65,50,32,13,-2,CLE,DTW,95,14,19,0,,0 +1996,9,18,3,48,38,731,720,HP,360,N629AW,223,222,204,11,10,LAS,DTW,1750,7,12,0,,0 +1996,9,30,1,814,815,1002,958,NW,1777,N918RW,108,103,84,4,-1,PHL,DTW,453,14,10,0,,0 +1996,9,13,5,2010,2010,2055,2055,WN,351,N685,105,105,93,0,0,HOU,ELP,677,3,9,0,,0 +1996,9,13,5,1627,1630,2234,2212,CO,140,N17619,247,222,229,22,-3,COS,EWR,1623,6,12,0,,0 +1996,9,27,5,1115,1115,1407,1407,AA,1768,N884AA,172,172,148,0,0,MIA,EWR,1086,6,18,0,,0 +1996,9,17,2,,2250,,24,DL,169,N485DA,,94,,,,JNU,FAI,624,0,0,1,,0 +1996,9,19,4,916,920,1010,1017,NW,611,N297US,174,177,158,-7,-4,MSP,GEG,1175,3,13,0,,0 +1996,9,7,6,1254,1256,1320,1329,US,991,N923VJ,26,33,17,-9,-2,CLT,GSP,75,2,7,0,,0 +1996,9,19,4,1531,1515,1628,1610,WN,42,N103,57,55,47,18,16,HRL,HOU,276,3,7,0,,0 +1996,9,16,1,1458,1455,1643,1626,UA,1208,N7298U,105,91,79,17,3,BOS,IAD,413,6,20,0,,0 +1996,9,16,1,1345,1340,1649,1644,CO,425,N15841,244,244,228,5,5,BOS,IAH,1597,4,12,0,,0 +1996,9,17,2,1117,1120,1251,1240,CO,1146,N12235,94,80,73,11,-3,LBB,IAH,458,7,14,0,,0 +1996,9,20,5,753,755,1330,1344,CO,185,N14346,217,229,194,-14,-2,SFO,IAH,1635,9,14,0,,0 +1996,9,13,5,1327,1330,1412,1419,US,1103,N890US,105,109,91,-7,-3,PHL,IND,587,3,11,0,,0 +1996,9,29,7,2343,2230,710,605,TW,778,N691LF,267,275,247,65,73,LAS,JFK,2248,5,15,0,,0 +1996,9,26,4,1955,1955,2235,2212,DL,1909,N614DL,340,317,312,23,0,BOS,LAS,2381,6,22,0,,0 +1996,9,21,6,825,825,918,915,WN,1451,N387,173,170,158,3,0,MCI,LAS,1140,2,13,0,,0 +1996,9,27,5,1010,1010,1129,1129,HP,2824,N145AW,79,79,66,0,0,SFO,LAS,414,3,10,0,,0 +1996,9,10,2,2221,2225,4,13,NW,339,N345NW,283,288,257,-9,-4,DTW,LAX,1979,4,22,0,,0 +1996,9,5,4,809,810,1006,1012,UA,491,N419UA,297,302,277,-6,-1,MCO,LAX,2217,5,15,0,,0 +1996,9,9,1,1749,1750,1901,1908,UA,2788,N928UA,72,78,60,-7,-1,PHX,LAX,370,5,7,0,,0 +1996,9,2,1,1605,1605,1600,1600,WN,977,N626,55,55,45,0,0,LBB,ABQ,289,3,7,0,,0 +1996,9,2,1,,630,,853,AS,81,UNKNOW,,203,,,,SEA,ANC,1449,0,0,1,,0 +1996,9,26,4,831,830,947,935,US,883,N914VJ,76,65,44,12,1,CLT,ATL,227,4,28,0,,0 +1996,9,16,1,1915,1900,2025,2010,DL,871,N903DL,70,70,55,15,15,GSO,ATL,306,5,10,0,,0 +1996,9,15,7,539,540,803,740,DL,1503,N919DL,84,60,70,23,-1,MEM,ATL,332,4,10,0,,0 +1996,9,6,5,2042,2010,2218,2147,DL,1127,N2821W,96,97,75,31,32,PIT,ATL,526,5,16,0,,0 +1996,9,1,7,1243,1245,1404,1411,DL,1818,N907DE,81,86,63,-7,-2,TPA,ATL,406,6,12,0,,0 +1996,9,12,4,700,700,732,735,NW,611,N296US,32,35,20,-3,0,LAN,AZO,62,7,5,0,,0 +1996,9,20,5,935,935,1058,1050,WN,1399,N610,83,75,61,8,0,STL,BHM,410,3,19,0,,0 +1996,9,26,4,744,746,914,900,TW,696,N935L,90,74,48,14,-2,STL,B,271,6,36,0,,0 +1996,9,4,3,1204,1200,1316,1306,CO,352,N13891,72,66,46,10,4,EWR,BOS,200,8,18,0,,0 +1996,9,19,4,1409,1410,1509,1519,US,2445,N519AU,60,69,49,-10,-1,ROC,BOS,343,5,6,0,,0 +1996,9,7,6,750,755,948,958,AS,114,N936AS,118,123,105,-10,-5,PDX,BUR,817,3,10,0,,0 +1996,9,26,4,918,920,1142,1150,US,398,N574US,84,90,69,-8,-2,IND,BWI,515,5,10,0,,0 +1996,9,24,2,844,845,930,935,US,1179,N930VJ,46,50,27,-5,-1,CLT,CHS,168,3,16,0,,0 +1996,9,24,2,1601,1605,1826,1810,CO,1210,N59338,85,65,66,16,-4,MDW,CLE,307,1,18,0,,0 +1996,9,21,6,1314,1315,1410,1411,US,503,N229US,56,56,48,-1,-1,CHA,CLT,242,4,4,0,,0 +1996,9,12,4,1759,1740,2004,1935,US,886,N439US,125,115,90,29,19,LGA,CLT,544,3,32,0,,0 +1996,9,16,1,817,815,1645,1603,US,102,N562AU,328,288,312,42,2,SEA,CLT,2279,5,11,0,,0 +1996,9,17,2,2128,2130,2352,2353,TW,260,N9403W,84,83,52,-1,-2,STL,CMH,410,4,28,0,,0 +1996,9,18,3,1657,1700,1804,1805,NW,1172,N930RC,67,65,45,-1,-3,DTW,CVG,229,6,16,0,,0 +1996,9,19,4,1453,1445,1815,1802,DL,552,N531DA,142,137,130,13,8,SAT,CVG,1024,5,7,0,,0 +1996,9,21,6,1510,1505,1608,1605,WN,39,N369,58,60,48,3,5,LIT,DAL,296,1,9,0,,0 +1996,9,4,3,1639,1640,1746,1752,US,1126,N373US,67,72,53,-6,-1,CLT,DCA,331,4,10,0,,0 +1996,9,28,6,1015,1015,1308,1256,UA,608,N7261U,113,101,90,12,0,ORD,DCA,612,3,20,0,,0 +1996,9,18,3,1031,1003,1109,1049,UA,425,N328UA,98,106,83,20,28,DSM,DEN,589,6,9,0,,0 +1996,9,2,1,1436,1438,1743,1747,UA,716,N389UA,127,129,112,-4,-2,ONT,DEN,819,6,9,0,,0 +1996,10,11,5,710,710,731,725,WN,76,N608,141,135,126,6,0,AUS,PHX,872,4,11,0,,0 +1996,10,2,3,1830,1830,1926,1930,WN,595,N600,56,60,44,-4,0,LAS,PHX,256,2,10,0,,0 +1996,10,20,7,2157,2155,2342,2325,AA,483,N410AA,225,210,203,17,2,ORD,PHX,1440,4,18,0,,0 +1996,10,13,7,817,820,929,939,HP,2842,N164AW,192,199,170,-10,-3,STL,PHX,1262,8,14,0,,0 +1996,10,28,1,1924,1925,2040,2027,US,1106,N981US,76,62,52,13,-1,CVG,PIT,256,6,18,0,,0 +1996,10,17,4,1037,1040,1259,1300,US,1240,N355US,82,80,67,-1,-3,MKE,PIT,431,5,10,0,,0 +1996,10,8,2,2221,2145,2251,2224,DL,1222,N3301,90,99,74,27,36,SLC,PSC,521,5,11,0,,0 +1996,10,5,6,2039,2045,2326,2333,AA,1418,N451AA,107,108,82,-7,-6,ORD,RDU,647,10,15,0,,0 +1996,10,11,5,2209,2150,2252,2220,DL,1667,N312WA,103,90,65,32,19,SLC,RNO,422,2,36,0,,0 +1996,10,3,4,1859,1847,1956,1948,AA,1212,N589AA,177,181,156,8,12,DFW,SAN,1171,4,17,0,,0 +1996,10,27,7,820,820,930,935,WN,263,N314,70,75,60,-5,0,SJC,SAN,417,2,8,0,,0 +1996,10,14,1,834,820,1234,1220,WN,702,N89,120,120,109,14,14,PHX,SAT,843,2,9,0,,0 +1996,10,11,5,1014,920,1214,1127,DL,835,N727DA,300,307,282,47,54,ATL,SEA,2182,5,13,0,,0 +1996,10,11,5,2156,2200,38,15,AA,293,N562AA,282,255,248,23,-4,ORD,SEA,1721,8,26,0,,0 +1996,10,21,1,1006,900,1306,1221,UA,33,N510UA,360,381,339,45,66,BOS,SFO,2704,6,15,0,,0 +1996,10,27,7,750,750,902,913,UA,2310,N354UA,72,83,60,-11,0,LAS,SFO,414,4,8,0,,0 +1996,10,15,2,1253,1248,1444,1444,UA,2301,N916UA,111,116,99,0,5,PHX,SFO,651,1,11,0,,0 +1996,10,14,1,1138,1137,1312,1310,UA,451,N331UA,154,153,132,2,1,DEN,SJC,948,4,18,0,,0 +1996,10,14,1,1114,1059,1654,1635,AA,1894,N621AA,280,276,246,19,15,DFW,SJU,2165,17,17,0,,0 +1996,10,8,2,36,37,251,246,HP,2780,N180AW,75,69,54,5,-1,LAS,SLC,368,10,11,0,,0 +1996,10,2,3,1304,1305,1533,1526,DL,2068,N504DA,89,81,75,7,-1,SMF,SLC,532,5,9,0,,0 +1996,10,12,6,1105,1056,1205,1204,AA,1317,N5CUAA,180,188,153,1,9,DFW,S,1205,8,19,0,,0 +1996,10,8,2,953,955,1050,1034,TW,469,N84357,117,99,75,16,-2,ATL,STL,483,25,17,0,,0 +1996,10,5,6,925,920,949,958,TW,431,N54332,84,98,67,-9,5,DTW,STL,440,4,13,0,,0 +1996,10,10,4,1441,1430,1555,1556,TW,635,N11004,134,146,120,-1,11,MCO,STL,880,5,9,0,,0 +1996,10,12,6,1149,1150,1306,1240,US,761,N956VJ,137,110,100,26,-1,PIT,STL,553,3,34,0,,0 +1996,10,8,2,1601,1600,1658,1656,US,1118,N929VJ,57,56,42,2,1,PHL,SYR,228,4,11,0,,0 +1996,10,16,3,1715,1715,1943,1945,WN,1632,N63,88,90,76,-2,0,MSY,TPA,487,5,7,0,,0 +1996,10,2,3,1759,1745,1901,1850,WN,1075,N682,62,65,54,11,14,SAN,TUS,367,2,6,0,,0 +1996,10,8,2,1115,1035,1236,1202,DL,1966,N406DA,81,87,63,34,40,TUS,LAX,451,5,13,0,,0 +1996,10,3,4,1038,1035,1604,1608,UA,1576,N351UA,206,213,189,-4,3,DEN,LGA,1619,5,12,0,,0 +1996,10,7,1,1646,1645,1801,1801,US,446,N288AU,75,76,56,0,1,ORF,LGA,296,10,9,0,,0 +1996,10,24,4,1258,1245,1539,1530,WN,282,N621,101,105,92,9,13,ABQ,MCI,718,3,6,0,,0 +1996,10,6,7,1616,1600,1711,1704,TW,191,N64320,55,64,41,7,16,STL,MCI,237,3,11,0,,0 +1996,10,9,3,900,900,940,950,WN,1253,N61,40,50,33,-10,0,FLL,MCO,178,2,5,0,,0 +1996,10,30,3,1835,1835,2010,2010,WN,625,N510,95,95,87,0,0,BHM,MDW,570,3,5,0,,0 +1996,10,12,6,1214,1215,1226,1232,DL,1284,N236WA,72,77,54,-6,-1,ATL,MEM,332,5,13,0,,0 +1996,10,11,5,1856,1900,1905,1911,NW,1567,N670MC,69,71,55,-6,-4,TYS,MEM,342,5,9,0,,0 +1996,10,1,2,1500,1500,1804,1803,AA,99,N5DUAA,184,183,160,1,0,JFK,MIA,1090,5,19,0,,0 +1996,10,4,5,1348,1350,1523,1522,US,579,N920VJ,95,92,69,1,-2,CLT,MLB,490,3,23,0,,0 +1996,10,20,7,1056,1100,1412,1352,NW,564,N292US,136,112,94,20,-4,DEN,MSP,680,2,40,0,,0 +1996,10,6,7,1633,1630,1844,1904,NW,589,N313US,191,214,172,-20,3,MCO,MSP,1310,4,15,0,,0 +1996,10,19,6,1157,1200,1709,1705,NW,96,N229NW,192,185,161,4,-3,SEA,MSP,1399,15,16,0,,0 +1996,10,18,5,1152,1150,1251,1252,CO,1625,N541NY,59,62,43,-1,2,IAH,MSY,305,4,12,0,,0 +1996,10,7,1,1541,1500,1652,1605,WN,1719,N365,71,65,50,47,41,LAX,OAK,337,4,17,0,,0 +1996,10,22,2,1604,1525,1717,1640,WN,1175,N53,73,75,64,37,39,HOU,OKC,419,3,6,0,,0 +1996,10,23,3,1947,1947,2145,2148,AS,578,N943AS,118,121,100,-3,0,PDX,ONT,838,5,13,0,,0 +1996,10,9,3,1630,1630,1754,1759,UA,1527,N7264U,84,89,64,-5,0,B,ORD,409,12,8,0,,0 +1996,10,10,4,1659,1700,1800,1758,UA,815,N566UA,121,118,92,2,-1,DCA,ORD,612,10,19,0,,0 +1996,10,28,1,1822,1826,1955,1945,AA,1995,N2CLAA,153,139,131,10,-4,HPN,ORD,738,11,11,0,,0 +1996,10,8,2,902,900,1023,1021,UA,288,N9002U,81,81,67,2,2,LNK,ORD,466,8,6,0,,0 +1996,10,5,6,639,642,1241,1231,AA,2098,N202AA,242,229,209,10,-3,PDX,ORD,1739,10,23,0,,0 +1996,10,8,2,1509,1511,2116,2115,AA,758,N226AA,247,244,223,1,-2,SFO,ORD,1846,9,15,0,,0 +1996,10,26,6,1330,1330,1419,1422,US,554,N255AU,49,52,39,-3,0,PHL,ORF,211,3,7,0,,0 +1996,10,15,2,2028,2028,2200,2158,AS,337,N938AS,92,90,81,2,0,OAK,PDX,543,4,7,0,,0 +1996,10,18,5,1510,1510,1629,1629,US,1475,N965VJ,79,79,65,0,0,BTV,PHL,336,5,9,0,,0 +1996,10,16,3,1445,1445,1821,1809,NW,684,N8929E,156,144,139,12,0,MSP,PHL,980,6,11,0,,0 +1996,10,4,5,1340,1336,1623,1615,AA,622,N614AA,103,99,84,8,4,ABQ,DFW,569,7,12,0,,0 +1996,10,2,3,1356,1400,1635,1645,AA,2034,N491AA,99,105,80,-10,-4,COS,DFW,592,6,13,0,,0 +1996,10,31,4,2212,2215,2302,2317,CO,541,N17619,50,62,37,-15,-3,IAH,DFW,224,5,8,0,,0 +1996,10,24,4,657,700,840,832,AA,1802,N2CA,103,92,74,8,-3,MFE,DFW,468,17,12,0,,0 +1996,10,20,7,740,743,1210,1157,AA,1502,N495AA,150,134,125,13,-3,PHX,DFW,868,6,19,0,,0 +1996,10,6,7,1000,1004,1509,1501,AA,738,N227AA,189,177,153,8,-4,S,DFW,1205,8,28,0,,0 +1996,10,18,5,1936,1940,2116,2115,NW,1137,N529US,100,95,67,1,-4,BWI,DTW,408,18,15,0,,0 +1996,10,28,1,1137,1140,1238,1254,NW,1520,N780NC,61,74,43,-16,-3,IND,DTW,231,10,8,0,,0 +1996,10,6,7,1036,1040,1245,1255,NW,1536,N712RC,69,75,46,-10,-4,ORD,DTW,235,10,13,0,,0 +1996,10,10,4,1220,1110,1322,1200,WN,803,N349,62,50,40,82,70,ABQ,ELP,223,3,19,0,,0 +1996,10,22,2,657,700,846,843,CO,441,N62631,109,103,93,3,-3,CHS,EWR,628,9,7,0,,0 +1996,10,18,5,2158,2200,540,520,DL,542,N625DL,282,260,254,20,-2,LAS,EWR,2227,10,18,0,,0 +1996,10,11,5,1705,1705,1912,1900,CO,1768,N24633,127,115,111,12,0,SDF,EWR,642,6,10,0,,0 +1996,10,26,6,125,115,150,137,DL,1490,N1402A,25,22,11,13,10,MIA,FLL,21,3,11,0,,0 +1996,10,10,4,1844,1745,1944,1856,US,862,N886US,60,71,48,48,59,PIT,GRR,319,4,8,0,,0 +1996,10,20,7,1700,1700,1740,1745,WN,853,N602,40,45,32,-5,0,AUS,HOU,148,2,6,0,,0 +1996,10,12,6,1520,1400,1707,1600,WN,589,N28,107,120,92,67,80,STL,HOU,687,2,13,0,,0 +1996,10,12,6,1327,1330,1551,1559,UA,914,N4714U,144,149,116,-8,-3,MIA,IAD,921,9,19,0,,0 +1996,10,12,6,1253,1250,1354,1353,AA,2053,N2AJAA,61,63,39,1,3,DFW,IAH,224,6,16,0,,0 +1996,10,31,4,1453,1455,1600,1600,CO,1643,N70755,67,65,54,0,-2,MSY,IAH,305,6,7,0,,0 +1996,10,31,4,1908,1855,2110,2045,UA,553,N9067U,122,110,99,25,13,ORD,ICT,588,5,18,0,,0 +1996,10,6,7,1633,1620,1723,1709,DL,1691,N3301,50,49,33,14,13,SLC,JAC,205,3,14,0,,0 +1996,10,14,1,1713,1700,2013,1958,AA,2198,N613AA,180,178,141,15,13,MIA,JFK,1090,8,31,0,,0 +1996,10,26,6,1603,1558,1652,1645,AA,1117,N207AA,169,167,144,7,5,DFW,LAS,1055,5,20,0,,0 +1996,10,10,4,2200,2155,2330,2335,AA,585,N262AA,210,220,191,-5,5,ORD,LAS,1515,5,14,0,,0 +1996,10,18,5,2021,1955,2109,2005,WN,1256,N376,108,70,61,64,26,SLC,LAS,368,2,45,0,,0 +1996,10,25,5,2318,2220,723,616,DL,1976,N1731D,305,296,279,67,58,HNL,LAX,2556,11,15,0,,0 +1996,10,11,5,1456,1420,1605,1536,UA,2243,N912UA,69,76,56,29,36,OAK,LAX,337,7,6,0,,0 +1996,10,3,4,835,830,954,950,WN,1188,N356,79,80,60,4,5,PHX,LAX,370,4,15,0,,0 +1996,10,30,3,1822,1745,2050,2025,WN,539,N614,88,100,76,25,37,LAX,ABQ,677,2,10,0,,0 +1996,10,30,3,1110,934,1237,1101,AS,52,N741AS,87,87,79,96,96,OTZ,ANC,549,4,4,0,,0 +1996,10,14,1,828,830,933,935,US,883,N952VJ,65,65,38,-2,-2,CLT,ATL,227,4,23,0,,0 +1996,10,7,1,1004,1005,1116,1108,DL,1068,N369DL,72,63,61,8,-1,GNV,ATL,300,6,5,0,,0 +1996,10,1,2,608,610,731,728,DL,1914,N647DL,83,78,66,3,-2,MCO,ATL,403,8,9,0,,0 +1996,10,24,4,531,530,736,730,DL,2031,N917DE,125,120,102,6,1,PHL,ATL,665,7,16,0,,0 +1996,10,24,4,1653,1655,1924,1929,TW,534,N925L,91,94,65,-5,-2,STL,ATL,483,10,16,0,,0 +1996,10,29,2,845,845,1152,1145,WN,687,N104,127,120,101,7,0,PHX,AUS,872,2,24,0,,0 +1996,10,8,2,1449,1400,1455,1421,US,556,N941VJ,66,81,54,34,49,CLT,BHM,351,2,10,0,,0 +1996,10,22,2,1608,1545,1751,1655,WN,413,N629,103,70,68,56,23,MDW,B,395,3,32,0,,0 +1996,10,21,1,1613,1600,1731,1726,US,934,N885US,78,86,61,5,13,DCA,BOS,399,9,8,0,,0 +1996,10,21,1,629,630,1001,939,AA,650,N262AA,152,129,136,22,-1,ORD,BOS,867,5,11,0,,0 +1996,10,16,3,1739,1740,1856,1902,CO,1090,N24213,77,82,51,-6,-1,EWR,BUF,282,3,23,0,,0 +1996,10,15,2,1826,1810,2059,2045,WN,1527,N602,93,95,82,14,16,B,BWI,588,3,8,0,,0 +1996,10,13,7,915,915,1040,1040,WN,1530,N392,85,85,78,0,0,SDF,BWI,495,1,6,0,,0 +1996,10,17,4,1213,1215,1348,1344,US,353,N281AU,95,89,81,4,-2,CLT,CLE,430,4,10,0,,0 +1996,10,25,5,2236,2240,601,557,CO,506,N59338,265,257,247,4,-4,SEA,CLE,2021,5,13,0,,0 +1996,10,26,6,757,800,1115,1126,US,1194,N259AU,138,146,116,-11,-3,DFW,CLT,936,11,11,0,,0 +1996,10,11,5,757,801,851,848,US,312,N926VJ,54,47,36,3,-4,MYR,CLT,156,9,9,0,,0 +1996,10,8,2,2108,2110,2231,2234,DL,1220,N638DL,83,84,57,-3,-2,ATL,CMH,446,7,19,0,,0 +1996,10,3,4,924,910,1021,1003,NW,667,N8878Z,177,173,156,18,14,DTW,COS,1146,7,14,0,,0 +1996,10,24,4,1019,1020,1159,1158,DL,321,N980DL,40,38,25,1,-1,IND,CVG,98,5,10,0,,0 +1996,10,19,6,1404,1405,1922,1915,DL,826,N119DL,198,190,172,7,-1,SLC,CVG,1449,7,19,0,,0 +1996,10,27,7,700,700,819,820,WN,474,N312,79,80,71,-1,0,MSY,DAL,437,3,5,0,,0 +1996,10,24,4,1906,1902,2008,2005,US,515,N919VJ,62,63,46,3,4,CMH,DCA,322,9,7,0,,0 +1996,10,1,2,1316,1314,1556,1554,UA,614,N510UA,100,100,81,2,2,ORD,DCA,612,3,16,0,,0 +1996,10,21,1,1000,955,1139,1050,UA,1561,N907UA,159,115,88,49,5,DFW,DEN,641,8,63,0,,0 +1996,10,28,1,1016,1010,1034,1039,UA,466,N7263U,78,89,66,-5,6,OMA,DEN,472,4,8,0,,0 +1996,11,4,1,2135,2135,2330,2340,DL,755,N493DA,235,245,216,-10,0,ATL,PHX,1587,4,15,0,,0 +1996,11,30,6,2325,2325,118,123,HP,2312,N188AW,53,58,38,-5,0,LAS,PHX,256,3,12,0,,0 +1996,11,28,4,1605,1605,1851,1844,HP,10,N915AW,226,219,207,7,0,ORD,PHX,1440,5,14,0,,0 +1996,11,22,5,2029,2005,2305,2225,WN,1102,N380,216,200,185,40,24,STL,PHX,1262,5,26,0,,0 +1996,11,1,5,1733,1701,2051,2043,US,1220,N818US,138,162,115,8,32,DFW,PIT,1068,8,15,0,,0 +1996,11,11,1,1744,1610,1900,1720,US,79,N613AU,76,70,44,100,94,PHL,PIT,267,7,25,0,,0 +1996,11,8,5,1447,1445,1643,1630,DL,734,N330DL,116,105,101,13,2,CVG,PVD,722,5,10,0,,0 +1996,11,22,5,2137,2140,2239,2238,US,344,N895US,62,58,42,1,-3,CLT,RIC,256,6,14,0,,0 +1996,11,28,4,1207,1210,1341,1320,CO,1046,N12230,94,70,50,21,-3,EWR,ROC,246,9,35,0,,0 +1996,11,8,5,2050,2005,2142,2100,WN,1115,N680,52,55,42,42,45,LAS,SAN,258,2,8,0,,0 +1996,11,3,7,1940,1940,2150,2150,WN,758,N507,130,130,120,0,0,B,SAT,822,2,8,0,,0 +1996,11,3,7,1700,1700,1814,1819,DL,1084,N901DL,74,79,56,-5,0,ATL,SDF,321,6,12,0,,0 +1996,11,27,3,1044,1035,1204,1135,WN,1721,N316,80,60,62,29,9,GEG,SEA,224,3,15,0,,0 +1996,11,9,6,1402,1355,1534,1556,UA,2187,N907UA,92,121,81,-22,7,SFO,SEA,679,3,8,0,,0 +1996,11,1,5,1734,1715,2044,2036,UA,77,N533UA,370,381,328,8,19,EWR,SFO,2565,7,35,0,,0 +1996,11,18,1,1724,1710,1836,1829,UA,2198,N917UA,72,79,53,7,14,ONT,SFO,363,4,15,0,,0 +1996,11,15,5,1146,1145,1233,1243,UA,2599,N325UA,107,118,88,-10,1,SLC,SFO,599,4,15,0,,0 +1996,11,21,4,1821,1755,1946,1910,WN,1018,N636,85,75,70,36,26,SAN,SJC,417,2,13,0,,0 +1996,11,4,1,1051,1050,1233,1236,AA,765,N2BAAA,162,166,148,-3,1,DFW,SLC,988,4,10,0,,0 +1996,11,21,4,1104,1025,1341,1306,DL,1070,N306WA,97,101,84,35,39,SAN,SLC,626,3,10,0,,0 +1996,11,10,7,2226,2235,2303,2315,DL,1619,N962DL,37,40,22,-12,-9,SJC,SMF,94,5,10,0,,0 +1996,11,10,7,1110,1111,1425,1435,TW,160,EI-CIW,135,144,121,-10,-1,ABQ,STL,934,4,10,0,,0 +1996,11,18,1,716,710,818,753,NW,1211,N716RC,122,103,101,25,6,DTW,STL,440,6,15,0,,0 +1996,11,27,3,1500,1500,1603,1610,WN,103,N51,63,70,50,-7,0,MDW,STL,251,5,8,0,,0 +1996,11,25,1,839,840,1430,1410,TW,230,N959U,231,210,214,20,-1,SAN,STL,1558,6,11,0,,0 +1996,11,13,3,1357,1355,1525,1520,DL,307,N1402A,88,85,60,5,2,ATL,TPA,406,4,24,0,,0 +1996,11,26,2,1902,1840,2225,2203,TW,204,N54344,143,143,107,22,22,STL,TPA,869,5,31,0,,0 +1996,11,5,2,1427,1430,1645,1652,UA,769,N9015U,78,82,65,-7,-3,ORD,TYS,475,2,11,0,,0 +1996,11,3,7,1730,1730,1840,1832,DL,1843,N481DA,70,62,48,8,0,BOS,LGA,185,3,19,0,,0 +1996,11,14,4,1959,1955,2313,2315,NW,988,N341NW,134,140,116,-2,4,MEM,LGA,963,8,10,0,,0 +1996,11,3,7,1419,1420,1522,1532,TW,279,N416EA,63,72,44,-10,-1,STL,LIT,296,5,14,0,,0 +1996,11,25,1,1807,1810,1927,1942,NW,1252,N945N,80,92,61,-15,-3,MSP,MCI,393,7,12,0,,0 +1996,11,16,6,826,830,1036,1046,US,2299,N449US,130,136,115,-10,-4,DCA,MCO,759,5,10,0,,0 +1996,11,8,5,702,700,954,1000,DL,2417,N322DL,172,180,156,-6,2,PVD,MCO,1073,6,10,0,,0 +1996,11,20,3,,1500,,1627,NW,1026,N307RC,,87,,,,MSP,MDW,349,0,0,1,,0 +1996,11,14,4,1838,1800,1939,1912,NW,864,N299US,61,72,50,27,38,MSY,MEM,349,3,8,0,,0 +1996,11,17,7,1922,1920,2322,2303,DL,832,N911DA,180,163,138,19,2,DFW,MIA,1121,6,36,0,,0 +1996,11,12,2,1830,1830,1933,1946,NW,102,N162US,63,76,40,-13,0,MSP,MKE,297,4,19,0,,0 +1996,11,27,3,1059,1105,1146,1152,DL,1536,N237WA,107,107,92,-6,-6,CVG,MSP,596,3,12,0,,0 +1996,11,28,4,1418,1420,1530,1537,NW,222,N759NW,72,77,61,-7,-2,MCI,MSP,393,5,6,0,,0 +1996,11,21,4,1226,1200,1721,1704,NW,96,N224NW,175,184,155,17,26,SEA,MSP,1399,11,9,0,,0 +1996,11,9,6,1758,1800,2016,2033,TW,881,N920TW,198,213,175,-17,-2,JFK,MSY,1182,5,18,0,,0 +1996,11,26,2,2042,1945,2238,2209,UA,469,N7456U,236,264,219,29,57,ORD,OAK,1835,5,12,0,,0 +1996,11,1,5,1649,1649,1849,1826,TW,519,N913TW,120,97,91,23,0,STL,OKC,462,7,22,0,,0 +1996,11,15,5,2003,1955,2106,2107,UA,2327,N372UA,63,72,50,-1,8,SFO,ONT,363,2,11,0,,0 +1996,11,11,1,1104,1100,1131,1138,UA,1815,N9067U,87,98,74,-7,4,BUF,ORD,473,2,11,0,,0 +1996,11,6,3,1233,1140,1330,1249,UA,391,N9054U,57,69,43,41,53,DSM,ORD,299,4,10,0,,0 +1996,11,21,4,1423,1420,1933,1947,AA,1664,N642AA,190,207,170,-14,3,LAS,ORD,1515,5,15,0,,0 +1996,11,14,4,1113,1115,1224,1234,AA,654,N2DJAA,71,79,55,-10,-2,MSP,ORD,334,4,12,0,,0 +1996,11,26,2,909,905,1037,1041,UA,565,N912UA,148,156,129,-4,4,PWM,ORD,900,9,10,0,,0 +1996,11,28,4,959,1002,1103,1105,AA,867,N568AA,124,123,95,-2,-3,SYR,ORD,607,10,19,0,,0 +1996,11,14,4,1655,1655,1923,1908,AS,367,N948AS,148,133,124,15,0,BUR,PDX,817,5,19,0,,0 +1996,11,11,1,1700,1700,1816,1825,WN,1714,N623,76,85,67,-9,0,SMF,PDX,479,3,6,0,,0 +1996,11,10,7,1553,1550,2004,1952,CO,1796,N69803,191,182,171,12,3,IAH,PHL,1324,4,16,0,,0 +1996,11,19,2,1157,1155,2011,2010,US,66,N530AU,314,315,280,1,2,SFO,PHL,2521,4,30,0,,0 +1996,11,23,6,1245,1245,1405,1402,DL,1103,N475DA,80,77,64,3,0,BTR,DFW,383,10,6,0,,0 +1996,11,1,5,1901,1842,2101,2053,AA,1281,N2DHAA,180,191,165,8,19,GSO,DFW,999,8,7,0,,0 +1996,11,18,1,1734,1738,1939,1938,AA,1079,N422AA,185,180,156,1,-4,MCO,DFW,984,20,9,0,,0 +1996,11,12,2,558,559,834,837,AA,1649,N716AA,216,218,187,-3,-1,PHL,DFW,1302,9,20,0,,0 +1996,11,3,7,1213,1217,1803,1739,AA,848,N223AA,230,202,167,24,-4,SMF,DFW,1431,52,11,0,,0 +1996,11,2,6,1246,1250,1426,1420,NW,1139,N9341,100,90,74,6,-4,BWI,DTW,408,12,14,0,,0 +1996,11,11,1,1037,1040,1118,1122,NW,242,N289US,41,42,23,-4,-3,LAN,DTW,74,10,8,0,,0 +1996,11,24,7,1237,1240,2011,1947,NW,894,N326US,274,247,254,24,-3,PDX,DTW,1953,10,10,0,,0 +1996,11,17,7,2027,2025,2107,2106,DL,183,N326DL,100,101,80,1,2,DFW,ELP,551,3,17,0,,0 +1996,11,1,5,809,810,1330,1347,CO,142,N60312,201,217,180,-17,-1,COS,EWR,1623,5,16,0,,0 +1996,11,5,2,1344,1345,1705,1725,NW,792,N783NC,141,160,128,-20,-1,MEM,EWR,946,7,6,0,,0 +1996,11,15,5,1642,1632,1734,1725,AS,93,N937AS,52,53,39,9,10,ANC,FAI,261,2,11,0,,0 +1996,11,9,6,1442,1440,1527,1536,NW,1807,N92S,45,56,33,-9,2,MSP,FSD,197,4,8,0,,0 +1996,11,8,5,1420,1420,1536,1524,US,511,N985VJ,76,64,59,12,0,PIT,GSO,304,3,14,0,,0 +1996,11,11,1,1930,1845,2122,2055,NW,275,N958N,172,190,154,27,45,DTW,HOU,1093,5,13,0,,0 +1996,11,22,5,1447,1445,1654,1620,UA,918,N418UA,127,95,110,34,2,ATL,IAD,533,7,10,0,,0 +1996,11,29,5,1015,1015,1322,1331,CO,185,N16892,247,256,220,-9,0,BOS,IAH,1597,15,12,0,,0 +1996,11,18,1,715,715,1221,1227,CO,1836,N73751,186,192,164,-6,0,LAX,IAH,1379,6,16,0,,0 +1996,11,7,4,1505,1450,2026,2022,CO,228,N45793,201,212,172,4,15,SFO,IAH,1635,10,19,0,,0 +1996,11,26,2,1516,1514,1717,1708,UA,1590,N337UA,61,54,34,9,2,ORD,IND,177,8,19,0,,0 +1996,11,4,1,2159,2200,539,604,AA,10,N167AA,280,304,256,-25,-1,LAX,JFK,2475,6,18,0,,0 +1996,11,30,6,924,905,1057,1050,CO,1745,N14816,273,285,250,7,19,CLE,LAS,1825,4,19,0,,0 +1996,11,10,7,1540,1540,1620,1625,WN,332,N625,160,165,151,-5,0,OMA,LAS,1099,4,5,0,,0 +1996,11,30,6,850,850,856,907,DL,1098,N543DA,66,77,51,-11,0,SLC,LAS,368,5,10,0,,0 +1996,11,2,6,1712,1710,14,22,NW,936,N158US,302,312,280,-8,2,HNL,LAX,2556,4,18,0,,0 +1996,11,11,1,1312,1315,1418,1429,UA,2861,N365UA,66,74,51,-11,-3,OAK,LAX,337,7,8,0,,0 +1996,11,30,6,701,700,747,745,DL,203,N784DA,46,45,22,2,1,SAN,LAX,109,5,19,0,,0 +1996,11,17,7,650,650,856,910,WN,352,N370,66,80,58,-14,0,LAS,ABQ,487,2,6,0,,0 +1996,11,27,3,2135,2116,2258,2241,AS,58,N730AS,83,85,75,17,19,OME,ANC,539,3,5,0,,0 +1996,11,27,3,915,915,1036,1045,DL,535,N623DL,81,90,63,-9,0,CMH,ATL,446,10,8,0,,0 +1996,11,3,7,1901,1905,1948,1956,DL,1241,N981DL,47,51,29,-8,-4,GSP,ATL,153,4,14,0,,0 +1996,11,18,1,1050,1050,1240,1236,DL,1054,N903DE,50,46,31,4,0,MGM,ATL,147,10,9,0,,0 +1996,11,9,6,1959,2000,2142,2138,US,1541,N941VJ,103,98,81,4,-1,PIT,ATL,526,10,12,0,,0 +1996,11,28,4,1006,1010,1055,1109,DL,969,N532DA,49,59,38,-14,-4,TYS,ATL,152,5,6,0,,0 +1996,11,6,3,718,720,851,850,CO,550,N12349,93,90,65,1,-2,CLE,BDL,475,5,23,0,,0 +1996,11,16,6,2151,2155,2308,2308,DL,1612,N531DA,77,73,54,0,-4,SLC,BIL,387,3,20,0,,0 +1996,11,17,7,1725,1655,2002,1935,WN,91,N677,97,100,85,27,30,LAS,BOI,520,3,9,0,,0 +1996,11,23,6,634,635,809,803,UA,1701,N568UA,95,88,61,6,-1,IAD,BOS,413,18,16,0,,0 +1996,11,14,4,1258,1300,2119,2128,AA,128,N5CTAA,321,328,303,-9,-2,SJC,BOS,2689,6,12,0,,0 +1996,11,5,2,1045,1045,1115,1110,WN,1737,N382,90,85,65,5,0,PHX,BUR,369,1,24,0,,0 +1996,11,29,5,1748,1750,2001,2001,US,1054,N520AU,133,131,112,0,-2,MCO,BWI,787,9,12,0,,0 +1996,11,13,3,1927,1920,2020,2018,UA,743,N9007U,53,58,34,2,7,ORD,CID,196,5,14,0,,0 +1996,11,6,3,1058,1100,1254,1310,CO,1150,N10236,56,70,44,-16,-2,MKE,CLE,328,4,8,0,,0 +1996,11,17,7,855,856,1004,1010,US,805,N974VJ,69,74,56,-6,-1,CMH,CLT,346,8,5,0,,0 +1996,11,15,5,1145,1145,1409,1412,US,331,N953VJ,84,87,74,-3,0,MEM,CLT,512,5,5,0,,0 +1996,11,24,7,1616,1615,1754,1750,US,217,N442US,98,95,80,4,1,TPA,CLT,508,9,9,0,,0 +1996,11,23,6,,2030,,2105,UA,1031,N7448U,,35,,,,DEN,COS,72,0,0,1,,0 +1996,11,5,2,1411,1415,1514,1517,DL,1717,N374DL,63,62,47,-3,-4,GRR,CVG,268,7,9,0,,0 +1996,11,27,3,859,850,1421,1400,DL,174,N715DA,202,190,165,21,9,SLC,CVG,1449,10,27,0,,0 +1996,11,20,3,700,700,759,745,WN,122,N699,59,45,43,14,0,OKC,DAL,181,3,13,0,,0 +1996,11,30,6,1542,1539,1919,1920,AA,1252,N485AA,157,161,135,-1,3,DFW,DCA,1192,4,18,0,,0 +1996,11,17,7,1225,1225,1318,1321,US,1503,N231US,53,56,41,-3,0,RDU,DCA,227,5,7,0,,0 +1996,11,6,3,1155,1155,1351,1335,UA,1211,N7270U,236,220,213,16,0,IAD,DEN,1452,6,17,0,,0 +1996,11,22,5,1315,1315,1512,1457,HP,2494,N324AW,117,102,78,15,0,PHX,DEN,602,4,35,0,,0 +1996,12,30,1,1013,900,1151,1051,DL,319,N282WA,218,231,203,60,73,CVG,PHX,1569,2,13,0,,0 +1996,12,9,1,1404,1245,1627,1503,HP,2610,N916AW,83,78,50,84,79,LAX,PHX,370,5,28,0,,0 +1996,12,26,4,1411,1235,1642,1510,WN,1726,N354,91,95,81,92,96,RNO,PHX,601,4,6,0,,0 +1996,12,29,7,842,840,920,921,UA,202,N574UA,38,41,27,-1,2,TUS,PHX,110,3,8,0,,0 +1996,12,23,1,805,807,907,900,US,699,N958VJ,62,53,49,7,-2,ELM,PIT,208,6,7,0,,0 +1996,12,8,7,2317,2320,501,518,US,156,N438US,224,238,210,-17,-3,PHX,PIT,1813,5,9,0,,0 +1996,12,23,1,1854,1650,2030,1832,NW,162,N780NC,96,102,79,118,124,DTW,PVD,614,5,12,0,,0 +1996,12,3,2,1812,1815,2008,2001,US,1581,N853US,116,106,88,7,-3,BOS,RIC,474,4,24,0,,0 +1996,12,21,6,1020,1015,1129,1124,US,314,N814US,69,69,51,5,5,DCA,ROC,296,6,12,0,,0 +1996,12,5,4,1727,1725,2044,2029,CO,177,N14107,377,364,347,15,2,EWR,SAN,2425,7,23,0,,0 +1996,12,28,6,818,810,937,930,WN,282,N615,79,80,67,7,8,SMF,SAN,480,2,10,0,,0 +1996,12,26,4,1405,1330,1458,1429,DL,1204,N2819W,53,59,37,29,35,ATL,SAV,215,3,13,0,,0 +1996,12,26,4,1745,1735,1921,1916,UA,1197,N1825U,156,161,135,5,10,DEN,SEA,1024,6,15,0,,0 +1996,12,13,5,1607,1607,1817,1805,AS,719,N937AS,190,178,158,12,0,PHX,SEA,1107,10,22,0,,0 +1996,12,10,2,1414,1240,1624,1431,DL,339,N282WA,310,291,295,113,94,CVG,SFO,2036,6,9,0,,0 +1996,12,5,4,2131,2130,2251,2248,UA,2058,N947UA,80,78,65,3,1,LAX,SFO,337,6,9,0,,0 +1996,12,30,1,2124,1950,2326,2118,UA,2352,N941UA,122,88,108,128,94,SAN,SFO,447,5,9,0,,0 +1996,12,5,4,1113,1100,1221,1205,WN,631,N694,68,65,59,16,13,LAX,SJC,308,2,7,0,,0 +1996,12,14,6,1135,0,1504,0,AA,1305,N063AA,149,150,120,-1,0,MIA,SJU,1045,5,24,0,,0 +1996,12,12,4,1637,1550,1910,1830,WN,1567,N354,93,100,81,40,47,LAX,SLC,590,2,10,0,,0 +1996,12,5,4,800,800,920,910,WN,896,N363,80,70,70,10,0,BUR,SMF,358,5,5,0,,0 +1996,12,26,4,,1607,,1728,AS,98,UNKNOW,,81,,,,OAK,S,371,0,0,1,,0 +1996,12,29,7,1410,1350,1518,1518,TW,85,N9409F,128,148,116,0,20,BWI,STL,737,4,8,0,,0 +1996,12,14,6,1704,1655,1902,1855,WN,371,N395,118,120,110,7,9,HOU,STL,687,2,6,0,,0 +1996,12,22,7,1817,1819,1908,1915,TW,517,N933L,51,56,36,-7,-2,MLI,STL,187,9,6,0,,0 +1996,12,10,2,815,815,1350,1359,TW,174,N651TW,215,224,185,-9,0,SFO,STL,1736,5,25,0,,0 +1996,12,6,5,1308,1230,1523,1453,US,223,N444US,135,143,121,30,38,BWI,TPA,842,4,10,0,,0 +1996,12,9,1,2139,2145,2222,2228,US,1165,N476US,43,43,30,-6,-6,CLT,TRI,120,4,9,0,,0 +1996,12,25,3,1520,1520,1730,1742,TW,96,N491SA,70,82,54,-12,0,STL,TYS,405,2,14,0,,0 +1996,12,4,3,1247,1212,1418,1353,US,1681,N428US,91,101,76,25,35,CLT,LGA,544,3,12,0,,0 +1996,12,3,2,1656,0,2003,0,AA,354,N461AA,127,122,95,1,-4,ORD,LGA,733,15,17,0,,0 +1996,12,4,3,1118,1120,1157,1204,NW,1275,N921RW,39,44,22,-7,-2,MSP,LSE,120,3,14,0,,0 +1996,12,31,2,926,925,1054,1049,UA,393,N9024U,88,84,69,5,1,ORD,MCI,403,5,14,0,,0 +1996,12,23,1,1910,1905,2116,2121,US,2301,N806US,126,136,108,-5,5,DCA,MCO,759,2,16,0,,0 +1996,12,23,1,1007,950,1230,1211,US,999,N262AU,143,141,126,19,17,PHL,MCO,861,4,13,0,,0 +1996,12,14,6,914,915,1043,1042,CO,1481,N69523,149,147,94,1,-1,EWR,MDW,711,3,52,0,,0 +1996,12,16,1,1327,1330,1905,1859,NW,554,N505US,218,209,197,6,-3,LAX,MEM,1619,7,14,0,,0 +1996,12,7,6,2014,2005,2223,2159,US,303,N226US,129,114,104,24,9,CLT,MIA,650,9,16,0,,0 +1996,12,17,2,2216,2100,101,2341,US,1101,N269AU,165,161,152,80,76,PHL,MIA,1013,3,10,0,,0 +1996,12,20,5,1708,1700,1833,1840,DL,1854,N518DA,145,160,126,-7,8,ATL,MSP,906,6,13,0,,0 +1996,12,3,2,730,730,830,822,NW,736,N608NW,60,52,47,8,0,FSD,MSP,197,3,10,0,,0 +1996,12,1,7,1559,1600,1734,1730,NW,139,N779NC,95,90,78,4,-1,ORD,MSP,334,5,12,0,,0 +1996,12,21,6,1717,1630,1817,1735,WN,1379,N683,60,65,49,42,47,BHM,MSY,321,3,8,0,,0 +1996,12,19,4,805,805,905,910,WN,1094,N397,60,65,51,-5,0,BUR,OAK,325,2,7,0,,0 +1996,12,30,1,1905,1845,2116,2040,WN,1723,N676,131,115,110,36,20,SEA,OAK,671,8,13,0,,0 +1996,12,16,1,2010,2005,2314,2303,DL,1698,N2821W,124,118,101,11,5,SLC,OMA,839,3,20,0,,0 +1996,12,2,1,1251,0,1349,0,AA,1531,N2CUAA,118,121,93,-5,-2,ATL,ORD,606,7,18,0,,0 +1996,12,16,1,703,705,1013,1015,UA,634,N7461U,130,130,115,-2,-2,COS,ORD,911,4,11,0,,0 +1996,12,18,3,1833,1817,2015,1956,AA,821,N2BWAA,162,159,132,19,16,EWR,ORD,719,6,24,0,,0 +1996,12,8,7,909,900,1457,1458,UA,106,N547UA,228,238,211,-1,9,LAX,ORD,1745,5,12,0,,0 +1996,12,24,2,,1800,,1930,NW,558,N289US,,90,,,,MSP,ORD,334,0,0,1,,0 +1996,12,31,2,2000,2005,2048,2059,AA,549,N2CTAA,108,114,86,-11,-5,ROC,ORD,528,6,16,0,,0 +1996,12,23,1,,700,,839,UA,265,UNKNOW,,159,,,,TPA,ORD,1012,0,0,1,,0 +1996,12,23,1,934,930,1141,1135,DL,51,N802DE,307,305,289,6,4,ATL,PDX,2172,3,15,0,,0 +1996,12,7,6,1455,1445,1557,1539,DL,417,N497DA,122,114,96,18,10,SLC,PDX,630,5,21,0,,0 +1996,12,23,1,707,710,829,837,US,635,N926VJ,82,87,64,-8,-3,DTW,PHL,453,6,12,0,,0 +1996,12,18,3,1136,1134,1253,1245,US,554,N963VJ,77,71,69,8,2,PVD,PHL,238,3,5,0,,0 +1996,12,10,2,1132,0,1320,0,AA,1355,N2CBAA,108,126,93,-24,-6,B,DFW,631,7,8,0,,0 +1996,12,7,6,1054,0,1328,0,AA,1352,N232AA,94,97,72,-6,-3,ELP,DFW,551,8,14,0,,0 +1996,12,26,4,1756,1759,2103,2110,AA,375,N234AA,247,251,216,-7,-3,LGA,DFW,1389,17,14,0,,0 +1996,12,31,2,1500,1500,1748,1746,AA,2237,N226AA,168,166,112,2,0,ORD,DFW,802,11,45,0,,0 +1996,12,16,1,1045,0,1605,0,AA,544,N210AA,200,226,175,-25,1,SEA,DFW,1660,12,13,0,,0 +1996,12,26,4,2029,1915,2129,2027,UA,1101,N7467U,60,72,43,62,74,ORD,DSM,299,4,13,0,,0 +1996,12,30,1,2000,1925,2157,2129,NW,371,N343NW,117,124,89,28,35,EWR,DTW,487,13,15,0,,0 +1996,12,14,6,1357,1325,1637,1611,NW,862,N786NC,100,106,80,26,32,MEM,DTW,610,9,11,0,,0 +1996,12,8,7,1324,1225,2007,1932,NW,266,N527US,223,247,199,35,59,SEA,DTW,1927,8,16,0,,0 +1996,12,14,6,1745,1730,1909,1859,UA,2222,N919UA,84,89,68,10,15,SFO,EUG,451,2,14,0,,0 +1996,12,12,4,1810,1720,2009,1905,CO,486,N59207,119,105,83,64,50,DTW,EWR,487,6,30,0,,0 +1996,12,8,7,936,930,1231,1220,UA,642,N7451U,115,110,92,11,6,ORD,EWR,719,7,16,0,,0 +1996,12,3,2,1429,1430,1754,1803,US,1438,N824US,205,213,189,-9,-1,BOS,FLL,1237,4,12,0,,0 +1996,12,19,4,1005,940,1105,1036,AS,505,N976AS,60,56,49,29,25,PDX,GEG,279,3,8,0,,0 +1996,12,17,2,1720,1715,1901,1854,NW,1754,N8921E,101,99,83,7,5,DTW,GSP,508,4,14,0,,0 +1996,12,16,1,2045,2045,2140,2140,WN,66,N528,55,55,42,0,0,HRL,HOU,276,5,8,0,,0 +1996,12,10,2,927,920,1046,1053,UA,1123,N412UA,79,93,63,-7,7,BOS,IAD,413,4,12,0,,0 +1996,12,19,4,718,714,905,900,CO,1948,N12532,107,106,94,5,4,BHM,IAH,562,4,9,0,,0 +1996,12,12,4,2058,1800,201,2302,CO,108,N14889,183,182,161,179,178,LAX,IAH,1379,4,18,0,,0 +1996,12,14,6,623,623,726,715,CO,532,N16813,63,52,45,11,0,SAT,IAH,191,6,12,0,,0 +1996,12,11,3,1005,1005,1220,1225,WN,1253,N521,135,140,120,-5,0,MCO,IND,828,6,9,0,,0 +1996,12,14,6,1746,1746,1917,1900,TW,153,N9302B,91,74,50,17,0,BOS,JFK,187,20,21,0,,0 +1996,12,24,2,1810,1755,1832,1820,WN,557,N629,82,85,72,12,15,ABQ,LAS,487,3,7,0,,0 +1996,12,20,5,2342,2230,18,2325,WN,1381,N335,36,55,25,53,72,LAX,LAS,236,3,8,0,,0 +1996,12,4,3,1306,1255,1345,1340,WN,529,N631,159,165,148,5,11,SAT,LAS,1069,3,8,0,,0 +1996,12,24,2,1146,1146,1304,1312,AA,1221,N290AA,198,206,169,-8,0,DFW,LAX,1235,5,24,0,,0 +1996,12,30,1,1820,1755,1924,1900,WN,785,N665,64,65,47,24,25,LAS,LAX,236,4,13,0,,0 +1996,12,18,3,837,840,1112,1130,US,17,N624AU,335,350,309,-18,-3,PHL,LAX,2401,10,16,0,,0 +1996,12,7,6,1538,1525,1714,1640,UA,2443,N901UA,96,75,70,34,13,SFO,LAX,337,10,16,0,,0 +1996,12,2,1,2030,2000,2309,2151,US,185,N587US,279,231,248,78,30,PIT,ABQ,1486,7,24,0,,0 +1996,12,7,6,1715,1655,2014,2001,DL,356,N303DL,119,126,101,13,20,AUS,ATL,813,10,8,0,,0 +1996,12,11,3,1000,1000,1150,1149,DL,1611,N906DE,110,109,84,1,0,DCA,ATL,547,5,21,0,,0 +1996,12,12,4,1711,1715,2015,2011,CO,1006,N69311,124,116,108,4,-4,IAH,ATL,689,5,11,0,,0 +1996,12,18,3,,1720,,2013,DL,1689,N903DL,,113,,,,MKE,ATL,669,0,0,1,,0 +1996,12,10,2,1306,1305,1416,1433,DL,499,N685DA,70,88,55,-17,1,RDU,ATL,356,4,11,0,,0 +1996,12,30,1,2045,2055,2136,2141,DL,1523,N420DA,51,46,28,-5,-10,TYS,ATL,152,9,14,0,,0 +1996,12,13,5,707,710,844,837,CO,550,N16521,97,87,80,7,-3,CLE,BDL,475,5,12,0,,0 +1996,12,26,4,2048,2020,2202,2141,UA,403,N7283U,74,81,62,21,28,DEN,BIL,455,2,10,0,,0 +1996,12,24,2,1601,1602,1654,1713,TW,552,N979Z,53,71,37,-19,-1,STL,B,271,3,13,0,,0 +1996,12,16,1,1056,1100,1157,1206,CO,350,N13881,61,66,40,-9,-4,EWR,BOS,200,6,15,0,,0 +1996,12,11,3,1619,1615,1804,1750,US,76,N633AU,105,95,74,14,4,PIT,BOS,496,13,18,0,,0 +1996,12,16,1,930,930,1027,1030,WN,318,N668,57,60,50,-3,0,OAK,BUR,325,2,5,0,,0 +1996,12,27,5,1114,1044,1506,1428,AA,1944,N813AA,172,164,148,38,30,DFW,BWI,1217,3,21,0,,0 +1996,12,9,1,2018,2020,2103,2059,US,1199,N889US,45,39,19,4,-2,PIT,CAK,70,5,21,0,,0 +1996,12,6,5,754,730,930,908,TW,165,N9302B,96,98,75,22,24,JFK,CLE,425,5,16,0,,0 +1996,12,16,1,,1040,,1254,US,795,UNKNOW,,134,,,,BOS,CLT,728,0,0,1,,0 +1996,12,25,3,1816,1821,1902,1913,US,729,N898US,46,52,33,-11,-5,ILM,CLT,185,6,7,0,,0 +1996,12,1,7,1346,1345,1434,1433,US,2309,N232US,48,48,36,1,1,RDU,CLT,130,4,8,0,,0 +1996,12,1,7,1416,1357,1610,1605,HP,1038,N185AW,114,128,101,5,19,MCO,CMH,802,3,10,0,,0 +1996,12,1,7,606,600,819,802,DL,561,N129DL,133,122,116,17,6,BDL,CVG,661,6,11,0,,0 +1996,12,21,6,1122,1115,1423,1400,DL,936,N373DL,121,105,103,23,7,OKC,CVG,756,9,9,0,,0 +1996,12,11,3,1912,1910,2000,1955,WN,238,N690,48,45,36,5,2,AUS,DAL,189,3,9,0,,0 +1996,12,8,7,1426,1425,1618,1621,UA,1288,N9030U,52,56,39,-3,1,ORD,DAY,240,5,8,0,,0 +1996,12,12,4,930,930,1037,1032,DL,1747,N491DA,67,62,43,5,0,LGA,DCA,214,5,19,0,,0 +1996,12,29,7,753,750,946,946,UA,1601,N979UA,173,176,145,0,3,B,DEN,1013,9,19,0,,0 +1996,12,13,5,1946,1945,2246,2257,UA,358,N407UA,120,132,105,-11,1,LAX,DEN,862,4,11,0,,0 +1996,12,29,7,1304,1255,1611,1604,UA,1760,N364UA,127,129,108,7,9,SAN,DEN,853,4,15,0,,0 diff --git a/Software/MATLAB/script/Examples/airlinesmall_1.csv b/Software/MATLAB/script/Examples/airlinesmall_1.csv new file mode 100644 index 0000000..458d831 --- /dev/null +++ b/Software/MATLAB/script/Examples/airlinesmall_1.csv @@ -0,0 +1,649 @@ +Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay,DepDelay,Origin,Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted +1996,1,18,4,2117,2120,2305,2259,HP,415,N637AW,108,99,85,6,-3,COS,PHX,551,5,18,0,,0 +1996,1,12,5,1252,1245,1511,1500,HP,610,N905AW,79,75,58,11,7,LAX,PHX,370,3,18,0,,0 +1996,1,16,2,1441,1445,1708,1721,HP,211,N165AW,87,96,74,-13,-4,RNO,PHX,601,4,9,0,,0 +1996,1,1,1,2258,2300,2336,2335,HP,1245,N183AW,38,35,20,1,-2,TUS,PHX,110,6,12,0,,0 +1996,1,4,4,1814,1814,1901,1910,US,683,N963VJ,47,56,34,-9,0,DTW,PIT,201,6,7,0,,0 +1996,1,31,3,1822,1820,1934,1925,US,757,N912VJ,72,65,52,9,2,PHL,PIT,267,6,14,0,,0 +1996,1,18,4,729,730,841,843,US,1564,N941VJ,72,73,58,-2,-1,DCA,PVD,357,3,11,0,,0 +1996,1,26,5,1704,1705,1829,1839,NW,1538,N960N,85,94,69,-10,-1,DTW,RIC,456,3,13,0,,0 +1996,1,11,4,1858,1850,1959,1956,US,2225,N351US,61,66,48,3,8,PHL,ROC,257,2,11,0,,0 +1996,1,7,7,2100,2100,2215,2220,WN,174,N677,75,80,65,-5,0,OAK,SAN,446,3,7,0,,0 +1996,1,16,2,1715,1715,1805,1810,WN,167,N20,50,55,41,-5,0,DAL,SAT,248,2,7,0,,0 +1996,1,30,2,1205,1210,1312,1322,CO,1127,N10236,67,72,52,-10,-5,CLE,SDF,304,4,11,0,,0 +1996,1,8,1,1232,1232,1520,1517,AS,62,N755AS,108,105,94,3,0,KTN,SEA,680,5,9,0,,0 +1996,1,30,2,1558,1600,1744,1757,UA,2410,N310UA,106,117,92,-13,-2,SFO,SEA,679,3,11,0,,0 +1996,1,14,7,2331,2325,616,605,UA,132,N4714U,285,280,263,11,6,HNL,SFO,2398,5,17,0,,0 +1996,1,7,7,1513,0,1738,0,AA,83,N339AA,265,268,246,10,13,ORD,SFO,1846,2,17,0,,0 +1996,1,27,6,711,710,814,802,UA,1053,N360UA,123,112,100,12,1,SLC,SFO,599,6,17,0,,0 +1996,1,12,5,635,635,846,840,WN,648,N357,131,125,113,6,0,SEA,SJC,697,2,16,0,,0 +1996,1,29,1,1544,0,1732,0,AA,1267,N822AA,168,158,148,12,2,DFW,SLC,988,5,15,0,,0 +1996,1,12,5,1308,1300,1539,1530,DL,1908,N302WA,91,90,74,9,8,PSP,SLC,541,7,10,0,,0 +1996,1,16,2,1207,1207,1355,1346,AS,84,N760AS,108,99,92,9,0,SEA,SMF,605,5,11,0,,0 +1996,1,2,2,914,840,1105,1005,DL,1537,N620DL,111,85,67,60,34,ATL,SRQ,445,3,41,0,,0 +1996,1,11,4,1121,0,1326,0,AA,426,N2CFAA,125,102,94,64,41,DFW,STL,551,6,25,0,,0 +1996,1,10,3,1629,1625,1743,1735,WN,492,N20,74,70,61,8,4,LIT,STL,296,2,11,0,,0 +1996,1,1,1,1240,1220,1345,1335,TW,675,N928L,65,75,48,10,20,ORD,STL,258,7,10,0,,0 +1996,1,24,3,2149,2150,2241,2247,NW,1241,N965N,52,57,40,-6,-1,MSP,SUX,234,4,8,0,,0 +1996,1,20,6,910,900,1102,1041,CO,1069,N44214,112,101,88,21,10,GSO,TPA,580,3,21,0,,0 +1996,1,3,3,1436,0,1552,0,AA,1997,N427AA,136,140,114,16,20,DFW,TUS,813,5,17,0,,0 +1996,1,29,1,1825,1825,1943,1945,WN,230,N667,78,80,60,-2,0,SMF,LAX,373,7,11,0,,0 +1996,1,15,1,1242,1230,1332,1321,DL,1752,N413DA,50,51,35,11,12,DCA,LGA,214,4,11,0,,0 +1996,1,2,2,1152,1100,1434,1355,UA,688,N422UA,102,115,87,39,52,ORD,LGA,733,5,10,0,,0 +1996,1,16,2,,2000,,2125,CO,1071,UNKNOW,,85,,,,IAH,MAF,429,0,0,1,,0 +1996,1,10,3,1528,1440,2058,2000,US,411,N391US,210,200,191,58,48,SFO,MCI,1499,6,13,0,,0 +1996,1,1,1,1103,1105,1333,1313,US,2002,N288AU,150,128,132,20,-2,IAD,MCO,758,9,9,0,,0 +1996,1,10,3,1515,1520,1533,1530,CO,1507,N14209,78,70,55,3,-5,CLE,MDW,307,8,15,0,,0 +1996,1,11,4,701,700,755,757,NW,854,N949N,54,57,42,-2,1,B,MEM,200,3,9,0,,0 +1996,1,17,3,1154,1155,1254,1302,CO,1675,N16617,60,67,47,-8,-1,IAH,MFE,316,3,10,0,,0 +1996,1,2,2,2107,1625,132,1928,TW,189,N54353,265,183,173,364,282,JFK,MIA,1090,7,85,0,,0 +1996,1,28,7,1213,1210,1330,1335,DL,929,N959DL,77,85,58,-5,3,ATL,MLB,443,5,14,0,,0 +1996,1,5,5,842,835,1121,1125,UA,204,N994UA,99,110,86,-4,7,DEN,MSP,680,3,10,0,,0 +1996,1,3,3,1452,1455,1608,1614,NW,557,N293US,76,79,60,-6,-3,MDW,MSP,349,4,12,0,,0 +1996,1,10,3,1521,1525,2051,2048,NW,156,N514US,210,203,194,3,-4,SEA,MSP,1399,4,12,0,,0 +1996,1,11,4,2309,2310,6,6,CO,1916,N14308,57,56,43,0,-1,IAH,MSY,305,5,9,0,,0 +1996,1,20,6,1156,1145,1306,1255,WN,517,N327,70,70,62,11,11,ONT,OAK,361,2,6,0,,0 +1996,1,28,7,,1415,,1542,NW,795,N925US,,87,,,,MEM,OKC,432,0,0,1,,0 +1996,1,23,2,1850,1850,1855,1855,WN,394,N528,65,65,56,0,0,PHX,ONT,325,1,8,0,,0 +1996,1,4,4,,0,,0,AA,1581,UNKNOW,,,,,,BOS,ORD,867,0,0,1,,0 +1996,1,8,1,1045,1040,1349,1358,UA,756,N1815U,124,138,105,-9,5,DEN,ORD,888,4,15,0,,0 +1996,1,28,7,2107,2110,2318,2327,CO,162,N73385,131,137,114,-9,-3,IAH,ORD,925,7,10,0,,0 +1996,1,15,1,1911,1905,2047,2045,UA,1259,N7269U,156,160,139,2,6,MCO,ORD,1005,5,12,0,,0 +1996,1,7,7,,1320,,1433,UA,773,UNKNOW,,133,,,,PHL,ORD,678,0,0,1,,0 +1996,1,5,5,916,915,1513,1512,UA,678,N7445U,237,237,213,1,1,SJC,ORD,1829,7,17,0,,0 +1996,1,11,4,1737,1733,1915,1915,DL,1819,N111DN,98,102,76,0,4,ATL,PBI,545,4,18,0,,0 +1996,1,23,2,1555,1555,1734,1725,WN,1705,N358,99,90,86,9,0,OAK,PDX,543,3,10,0,,0 +1996,1,28,7,2149,2145,2310,2312,US,489,N617AU,81,87,61,-2,4,CLT,PHL,448,8,12,0,,0 +1996,1,11,4,835,830,1516,1452,US,164,N516AU,281,262,260,24,5,PHX,PHL,2075,3,18,0,,0 +1996,1,28,7,1152,1150,1308,1300,DL,161,N912DL,136,130,118,8,2,ATL,DFW,732,5,13,0,,0 +1996,1,10,3,856,0,1147,0,AA,1472,N455AA,111,126,84,-14,1,DEN,DFW,641,10,17,0,,0 +1996,1,29,1,1750,0,2206,0,AA,884,N470AA,136,150,121,-14,0,LAS,DFW,1055,6,9,0,,0 +1996,1,6,6,831,0,1002,0,AA,1593,N407AA,91,98,73,-9,-2,MSY,DFW,448,9,9,0,,0 +1996,1,31,3,850,0,1334,0,AA,2002,N446AA,164,175,136,-11,0,SAN,DFW,1171,15,13,0,,0 +1996,1,19,5,250,0,534,0,AA,2361,N460AA,104,111,91,-12,-5,TUS,DFW,813,4,9,0,,0 +1996,1,5,5,1535,1530,2006,2006,UA,328,N537UA,151,156,129,0,5,DEN,DTW,1123,6,16,0,,0 +1996,1,11,4,2034,1935,2240,2140,NW,1410,N89S,66,65,38,60,59,MDW,DTW,229,17,11,0,,0 +1996,1,1,1,2019,2020,2143,2143,NW,1501,N8957E,84,83,62,0,-1,ROC,DTW,296,5,17,0,,0 +1996,1,31,3,1542,1544,1643,1648,HP,428,N141AW,61,64,50,-5,-2,PHX,ELP,347,3,8,0,,0 +1996,1,28,7,809,0,1209,0,AA,1058,N274AA,180,201,158,-19,2,DFW,EWR,1372,7,15,0,,0 +1996,1,9,2,1750,1730,2117,2031,UA,658,N7260U,147,121,122,46,20,ORD,EWR,719,6,19,0,,0 +1996,1,15,1,1529,1515,2110,2102,UA,1590,N332UA,221,227,198,8,14,DEN,FLL,1703,3,20,0,,0 +1996,1,15,1,1716,1710,1815,1815,DL,1961,N326DL,59,65,46,0,6,ATL,GNV,300,3,10,0,,0 +1996,1,31,3,1830,1830,2013,2010,US,835,N973VJ,103,100,89,3,0,PHL,GSP,514,5,9,0,,0 +1996,1,22,1,1515,1515,1608,1610,WN,42,N53,53,55,43,-2,0,HRL,HOU,276,4,6,0,,0 +1996,1,27,6,1334,1333,1523,1530,DL,1232,N989DL,109,117,66,-7,1,ATL,IAD,533,5,38,0,,0 +1996,1,30,2,1147,1150,1336,1348,CO,1101,N12514,109,118,95,-12,-3,B,IAH,657,4,10,0,,0 +1996,1,6,6,130,125,627,623,CO,1856,N15820,177,178,159,4,5,LAX,IAH,1379,4,14,0,,0 +1996,1,29,1,1845,1805,2009,1925,CO,1767,N12327,144,140,124,44,40,SDF,IAH,788,6,14,0,,0 +1996,1,26,5,1315,1315,1556,1551,NW,1266,N728RW,101,96,73,5,0,MSP,IND,503,7,21,0,,0 +1996,1,29,1,1309,1305,1745,1725,DL,1980,N171DN,216,200,164,20,4,DFW,JFK,1391,25,27,0,,0 +1996,1,22,1,2211,2215,2329,2328,HP,739,N901AW,258,253,246,1,-4,ATL,LAS,1747,3,9,0,,0 +1996,1,2,2,931,925,1014,1046,NW,719,N533US,163,201,148,-32,6,MSP,LAS,1300,4,11,0,,0 +1996,1,27,6,2109,2100,2218,2219,UA,2196,N942UA,69,79,53,-1,9,SFO,LAS,414,4,12,0,,0 +1996,1,26,5,1100,1100,1406,1355,CO,239,N57111,366,355,340,11,0,EWR,LAX,2454,7,19,0,,0 +1996,1,17,3,2127,2005,2325,2208,NW,309,N635US,238,243,200,77,82,MSP,LAX,1536,7,31,0,,0 +1996,1,9,2,1330,1330,1345,1350,WN,1042,N333,75,80,59,-5,0,PHX,LAX,370,5,11,0,,0 +1996,1,19,5,1605,1605,1710,1705,WN,970,N337,125,120,115,5,0,HOU,ABQ,759,2,8,0,,0 +1996,1,4,4,1155,1155,1251,1252,AS,144,N745AS,56,57,40,-1,0,FAI,ANC,261,4,12,0,,0 +1996,1,29,1,600,600,751,740,DL,1419,N918DE,111,100,96,11,0,CLE,ATL,554,7,8,0,,0 +1996,1,10,3,732,645,932,904,DL,1643,N126DL,120,139,99,28,47,EWR,ATL,745,7,14,0,,0 +1996,1,18,4,1459,1005,1927,1249,DL,471,N998DL,208,104,132,398,294,MCI,ATL,692,8,68,0,,0 +1996,1,30,2,1248,1245,1436,1421,DL,499,N406DA,108,96,90,15,3,PBI,ATL,545,6,12,0,,0 +1996,1,23,2,1442,1440,1631,1607,DL,1854,N613DL,109,87,92,24,2,SRQ,ATL,445,6,11,0,,0 +1996,1,13,6,1503,0,1743,0,AA,1185,N2AJAA,160,164,134,-6,-2,ORD,AUS,978,10,16,0,,0 +1996,1,30,2,1351,1336,1341,1325,DL,1817,N675DL,50,49,34,16,15,ATL,BHM,134,3,13,0,,0 +1996,1,20,6,1730,1730,1844,1900,WN,336,N303,74,90,63,-16,0,MCI,B,491,5,6,0,,0 +1996,1,29,1,1629,1630,1755,1756,US,1132,N896US,86,86,59,-1,-1,DCA,BOS,399,11,16,0,,0 +1996,1,10,3,2028,0,2353,0,AA,1198,N5BVAA,145,131,120,192,178,ORD,BOS,867,6,19,0,,0 +1996,1,31,3,2024,2020,2136,2134,US,838,N279AU,72,74,54,2,4,LGA,BUF,292,2,16,0,,0 +1996,1,19,5,1511,1500,1648,1630,US,470,N226US,97,90,78,18,11,BOS,BWI,370,6,13,0,,0 +1996,1,12,5,2311,2315,709,737,US,46,N510AU,298,322,282,-28,-4,SFO,BWI,2457,6,10,0,,0 +1996,1,27,6,1901,1855,2005,1950,DL,1078,N908DL,64,55,42,15,6,CVG,CLE,221,6,16,0,,0 +1996,1,23,2,1517,1517,1747,1750,TW,556,N54349,90,93,66,-3,0,STL,CLE,487,5,19,0,,0 +1996,1,20,6,1111,1110,1312,1302,US,2250,N376US,121,112,95,10,1,EWR,CLT,529,3,23,0,,0 +1996,1,11,4,1358,1350,1501,1458,US,2474,N929VJ,63,68,52,3,8,ORF,CLT,290,4,7,0,,0 +1996,1,9,2,1857,1755,2010,1912,US,927,N927VJ,73,77,55,58,62,DCA,CMH,322,4,14,0,,0 +1996,1,17,3,952,955,1055,1050,CO,1771,N15525,63,55,40,5,-3,IAH,CRP,201,5,18,0,,0 +1996,1,6,6,809,730,1038,1009,DL,1124,N917DE,149,159,125,29,39,MIA,CVG,948,4,20,0,,0 +1996,1,27,6,1055,1055,1321,1325,WN,296,N693,86,90,75,-4,0,ABQ,DAL,580,2,9,0,,0 +1996,1,3,3,2145,2055,2312,2217,DL,1620,N990DL,87,82,63,55,50,ATL,DAY,432,10,14,0,,0 +1996,1,16,2,1700,1700,1830,1814,CO,321,N17773,90,74,45,16,0,EWR,DCA,199,8,37,0,,0 +1996,1,25,4,1023,1010,1309,1312,TW,484,N9307R,106,122,89,-3,13,STL,DCA,719,2,15,0,,0 +1996,1,20,6,1133,1130,1310,1253,CO,1806,N16895,157,143,123,17,3,IAH,DEN,861,6,28,0,,0 +1996,1,29,1,1819,1820,2006,2002,HP,491,N186AW,107,102,85,4,-1,PHX,DEN,602,1,21,0,,0 +1996,2,26,1,,2000,,2111,HP,2636,N126AW,,71,,,,ELP,PHX,347,0,0,1,,0 +1996,2,19,1,919,920,1205,1134,NW,101,N533US,226,194,197,31,-1,MSP,PHX,1276,2,27,0,,0 +1996,2,27,2,1109,1110,1355,1353,HP,1288,N305AW,106,103,91,2,-1,SJC,PHX,621,5,10,0,,0 +1996,2,17,6,1903,1842,1943,1925,US,1457,N931VJ,40,43,29,18,21,CLE,PIT,105,6,5,0,,0 +1996,2,23,5,1043,1040,1319,1327,US,946,N881US,96,107,85,-8,3,MEM,PIT,652,5,6,0,,0 +1996,2,17,6,2057,2105,2151,2155,DL,1522,N909DA,54,50,30,-4,-8,MSY,PNS,186,4,20,0,,0 +1996,2,20,2,1020,1005,1315,1255,TW,582,N921L,115,110,93,20,15,STL,RDU,667,4,18,0,,0 +1996,2,11,7,2044,2030,2149,2140,NW,1500,N3312L,65,70,47,9,14,DTW,ROC,296,4,14,0,,0 +1996,2,2,5,2148,2000,2242,2055,WN,1111,N326,54,55,43,107,108,LAS,SAN,258,2,9,0,,0 +1996,2,13,2,747,740,835,835,WN,153,N512,48,55,39,0,7,DAL,SAT,248,2,7,0,,0 +1996,2,8,4,1253,1255,1336,1329,DL,703,N303DL,43,34,22,7,-2,CVG,SDF,83,4,17,0,,0 +1996,2,5,1,2130,2058,10,2328,AS,277,N976AS,160,150,140,42,32,LAX,SEA,954,5,15,0,,0 +1996,2,16,5,645,645,824,830,AS,409,N760AS,99,105,84,-6,0,SMF,SEA,605,5,10,0,,0 +1996,2,22,4,1456,1445,1834,1755,UA,901,N601UA,398,370,350,39,11,JFK,SFO,2586,5,43,0,,0 +1996,2,4,7,1125,935,1238,1043,HP,604,N149AW,133,128,120,115,110,PHX,SFO,651,4,9,0,,0 +1996,2,28,3,1454,1440,1630,1616,UA,1499,N339UA,156,156,142,14,14,DEN,SJC,948,4,10,0,,0 +1996,2,17,6,803,700,1120,1022,AA,476,N5BVAA,137,142,113,58,63,MIA,SJU,1045,3,21,0,,0 +1996,2,12,1,911,910,1046,1043,DL,1893,N907DA,155,153,137,3,1,MCI,SLC,919,7,11,0,,0 +1996,2,1,4,2119,1955,2242,2117,UA,1663,N7292U,143,142,128,85,84,DEN,SMF,910,4,11,0,,0 +1996,2,22,4,858,900,1134,1117,AA,1689,N5CYAA,276,257,255,17,-2,ORD,S,1726,4,17,0,,0 +1996,2,29,4,1959,1950,2054,2045,US,659,N968VJ,115,115,102,9,9,CLT,STL,575,3,10,0,,0 +1996,2,22,4,,800,,931,TW,46,UNKNOW,,91,,,,JAN,STL,444,0,0,1,,0 +1996,2,29,4,950,950,1100,1110,WN,528,N96,70,80,60,-10,0,OKC,STL,462,3,7,0,,0 +1996,2,15,4,1059,1100,1222,1217,TW,72,N54338,83,77,65,5,-1,TUL,STL,351,5,13,0,,0 +1996,2,2,5,1230,1225,,1515,CO,437,N16883,,170,,,5,EWR,TPA,998,0,30,0,,1 +1996,2,14,3,2130,2035,2313,2236,DL,1297,N477DA,223,241,207,37,55,CVG,TUS,1548,6,10,0,,0 +1996,2,19,1,731,730,756,753,DL,1975,N283WA,85,83,74,3,1,TUS,LAX,451,5,6,0,,0 +1996,2,3,6,1708,1615,2116,2027,AA,738,N215AA,188,192,150,49,53,DFW,LGA,1389,15,23,0,,0 +1996,2,27,2,718,720,822,830,US,271,N864US,64,70,51,-8,-2,RIC,LGA,292,4,9,0,,0 +1996,2,7,3,1546,1515,1807,1740,UA,704,N7265U,81,85,66,27,31,DEN,MCI,533,2,13,0,,0 +1996,2,23,5,1858,1850,2151,2150,DL,1665,N948DL,173,180,151,1,8,BOS,MCO,1121,5,17,0,,0 +1996,2,9,5,829,825,1041,1054,US,1043,N812US,132,149,119,-13,4,PHL,MCO,861,4,9,0,,0 +1996,2,8,4,1651,1640,1824,1808,NW,737,N677MC,93,88,61,16,11,MSP,MDW,349,5,27,0,,0 +1996,2,7,3,1432,1435,1614,1633,NW,676,N986US,102,118,88,-19,-3,MSP,MEM,700,5,9,0,,0 +1996,2,24,6,1054,1045,1425,1420,AA,1614,N722AA,151,155,127,5,9,DFW,MIA,1121,8,16,0,,0 +1996,2,13,2,1517,1520,1523,1528,NW,371,N324US,66,68,43,-5,-3,DTW,MKE,238,5,18,0,,0 +1996,2,10,6,657,700,751,758,NW,707,N202US,114,118,98,-7,-3,CMH,MSP,627,7,9,0,,0 +1996,2,25,7,1912,1825,2141,2029,NW,515,N322US,209,184,163,72,47,LGA,MSP,1020,6,40,0,,0 +1996,2,29,4,1301,1305,1349,1340,NW,1820,N942N,48,35,32,9,-4,RST,MSP,76,7,9,0,,0 +1996,2,16,5,1055,1100,1157,1200,CO,1908,N33506,62,60,43,-3,-5,IAH,MSY,305,4,15,0,,0 +1996,2,18,7,2100,2100,2219,2205,WN,1432,N319,79,65,65,14,0,ONT,OAK,361,2,12,0,,0 +1996,2,2,5,1403,1400,1542,1543,TW,337,N405EA,99,103,78,-1,3,STL,OKC,462,4,17,0,,0 +1996,2,6,2,1749,1539,1854,1652,UA,2321,N321UA,65,73,53,122,130,SFO,ONT,363,2,10,0,,0 +1996,2,7,3,2022,2025,2122,2126,UA,241,N582UA,120,121,104,-4,-3,BWI,ORD,622,5,11,0,,0 +1996,2,26,1,700,700,718,710,NW,161,N784NC,78,70,49,8,0,DTW,ORD,235,4,25,0,,0 +1996,2,16,5,650,635,1302,1231,AA,1492,N565AA,252,236,221,31,15,LAX,ORD,1745,7,24,0,,0 +1996,2,7,3,1401,1400,1507,1514,NW,134,N517US,66,74,48,-7,1,MSP,ORD,334,5,13,0,,0 +1996,2,27,2,1422,1355,1455,1434,UA,1847,N7455U,93,99,81,21,27,ROC,ORD,528,3,9,0,,0 +1996,2,4,7,1424,1344,1542,1515,DL,638,N996DL,78,91,62,27,40,ATL,ORF,516,5,11,0,,0 +1996,2,16,5,2202,2154,2356,2359,AA,1051,N540AA,234,245,222,-3,8,DFW,PDX,1616,3,9,0,,0 +1996,2,25,7,1839,1830,2019,2034,US,694,N934VJ,100,124,90,-15,9,ATL,PHL,665,2,8,0,,0 +1996,2,3,6,1544,1355,1815,1640,US,2720,N523AU,151,165,128,95,109,MIA,PHL,1013,7,16,0,,0 +1996,2,4,7,938,930,1049,1100,UA,1821,N387UA,131,150,114,-11,8,STL,DEN,770,7,10,0,,0 +1996,2,14,3,1520,1520,1751,1801,DL,1687,N937DL,91,101,73,-10,0,COS,DFW,592,9,9,0,,0 +1996,2,11,7,558,600,652,700,DL,859,N977DL,54,60,39,-8,-2,IAH,DFW,224,4,11,0,,0 +1996,2,8,4,1133,1115,1355,1344,NW,411,N676MC,142,149,114,11,18,MSP,DFW,852,5,23,0,,0 +1996,2,8,4,1359,1325,1848,1810,DL,1028,N902DA,169,165,153,38,34,SAN,DFW,1171,6,10,0,,0 +1996,2,7,3,1235,1235,1527,1507,UA,1828,N947UA,112,92,75,20,0,DEN,DSM,589,5,32,0,,0 +1996,2,26,1,658,700,855,854,CO,1459,N14239,117,114,86,1,-2,EWR,DTW,487,10,21,0,,0 +1996,2,20,2,803,800,1108,1109,NW,992,N336NW,185,189,169,-1,3,MIA,DTW,1145,5,11,0,,0 +1996,2,22,4,1847,1830,2114,2110,TW,280,N54350,87,100,62,4,17,STL,DTW,440,13,12,0,,0 +1996,2,1,4,,2120,,2327,DL,542,N607DL,,127,,,,ATL,EWR,745,0,0,1,,0 +1996,2,3,6,2354,2355,725,730,CO,1642,N58101,271,275,250,-5,-1,LAS,EWR,2227,7,14,0,,0 +1996,2,4,7,1546,1515,1924,1842,TW,32,N950U,158,147,135,42,31,STL,EWR,872,11,12,0,,0 +1996,2,23,5,1135,1120,1229,1215,WN,319,N379,54,55,37,14,15,TPA,FLL,197,3,14,0,,0 +1996,2,13,2,1244,1245,1409,1418,CO,1135,N17317,85,93,65,-9,-1,EWR,GSO,446,4,16,0,,0 +1996,2,27,2,1835,1835,2038,2035,WN,1535,N86,123,120,113,3,0,B,HOU,670,5,5,0,,0 +1996,2,5,1,1703,1705,2001,2011,UA,1482,N912UA,118,126,93,-10,-2,ORD,HPN,738,3,22,0,,0 +1996,2,15,4,1340,1340,1634,1630,CO,1669,N59630,114,110,93,4,0,ABQ,IAH,744,6,15,0,,0 +1996,2,10,6,711,710,853,855,CO,1857,N33608,162,165,147,-2,1,FLL,IAH,965,6,9,0,,0 +1996,2,10,6,713,715,1208,1210,CO,178,N10801,175,175,159,-2,-2,SAN,IAH,1303,4,12,0,,0 +1996,2,8,4,2116,1955,2339,2209,NW,945,N9338,83,74,61,90,81,MEM,IND,381,6,16,0,,0 +1996,2,12,1,1404,1355,1554,1536,TW,766,N52311,110,101,78,18,9,DTW,JFK,508,4,28,0,,0 +1996,2,11,7,1512,1450,1603,1545,WN,610,N366,51,55,38,18,22,BUR,LAS,223,4,9,0,,0 +1996,2,3,6,1600,1600,1646,1650,WN,852,N696,46,50,36,-4,0,ONT,LAS,197,2,8,0,,0 +1996,2,16,5,1340,1330,1442,1445,WN,1643,N513,62,75,55,-3,10,SMF,LAS,397,2,5,0,,0 +1996,2,13,2,1846,1845,2048,2025,CO,738,N18835,242,220,204,23,1,IAH,LAX,1379,15,23,0,,0 +1996,2,27,2,1704,1700,1842,1810,WN,1718,N615,98,70,81,32,4,OAK,LAX,337,7,10,0,,0 +1996,2,18,7,800,800,916,913,DL,1031,N401DA,76,73,50,3,0,SFO,LAX,337,5,21,0,,0 +1996,2,20,2,930,930,1028,1030,WN,801,N310,58,60,40,-2,0,PHX,ABQ,328,3,15,0,,0 +1996,2,17,6,924,925,1229,1220,DL,662,N499DA,125,115,98,9,-1,AUS,ATL,813,16,11,0,,0 +1996,2,2,5,1413,1255,1909,1735,DL,1108,N606DL,176,160,159,94,78,DEN,ATL,1199,8,9,0,,0 +1996,2,2,5,823,800,1125,1057,DL,652,N321DL,122,117,102,28,23,ICT,ATL,781,7,13,0,,0 +1996,2,21,3,1223,1115,1528,1431,DL,1249,N905DL,125,136,111,57,68,MSP,ATL,906,3,11,0,,0 +1996,2,22,4,734,735,1050,1041,DL,1710,N906DL,136,126,118,9,-1,SAT,ATL,874,11,7,0,,0 +1996,2,10,6,1914,1905,2126,2120,WN,506,N607,72,75,64,6,9,ELP,AUS,528,4,4,0,,0 +1996,2,18,7,2138,2130,2255,2249,US,1490,N775AU,77,79,53,6,8,PIT,BDL,406,6,18,0,,0 +1996,2,29,4,850,850,1049,1022,CO,1035,N77215,179,152,132,27,0,EWR,B,748,7,40,0,,0 +1996,2,29,4,2235,2235,16,15,DL,1778,N134DL,101,100,84,1,0,CVG,BOS,752,5,12,0,,0 +1996,2,18,7,1631,1630,1938,1946,AA,1278,N597AA,127,136,103,-8,1,ORD,BOS,867,9,15,0,,0 +1996,2,23,5,,1325,,1552,UA,540,UNKNOW,,87,,,,ORD,BUF,473,0,0,1,,0 +1996,2,16,5,,1520,,1633,US,898,UNKNOW,,73,,,,CLT,BWI,361,0,0,1,,0 +1996,2,10,6,1006,1007,1053,1055,DL,2009,N947DL,47,48,32,-2,-1,ATL,CAE,191,3,12,0,,0 +1996,2,26,1,1550,1550,1916,1923,CO,1994,N33817,146,153,121,-7,0,IAH,CLE,1091,15,10,0,,0 +1996,2,22,4,610,600,811,810,US,1071,N413US,121,130,105,1,10,BOS,CLT,728,4,12,0,,0 +1996,2,28,3,644,643,802,755,US,541,N574US,78,72,61,7,1,JAX,CLT,329,6,11,0,,0 +1996,2,28,3,853,855,1011,1008,US,487,N970VJ,78,73,54,3,-2,SDF,CLT,336,15,9,0,,0 +1996,2,21,3,2224,2055,41,2310,WN,321,N522,77,75,64,91,89,STL,CMH,410,3,10,0,,0 +1996,2,23,5,1105,1055,1208,1158,DL,715,N924DL,63,63,48,10,10,GRR,CVG,268,4,11,0,,0 +1996,2,1,4,1410,1410,1931,1922,DL,826,N614DL,201,192,154,9,0,SLC,CVG,1449,26,21,0,,0 +1996,2,14,3,1153,1145,1230,1230,WN,324,N130,37,45,29,0,8,OKC,DAL,181,2,6,0,,0 +1996,2,7,3,1257,1256,1648,1643,DL,678,N908DA,171,167,147,5,1,DFW,DCA,1192,11,13,0,,0 +1996,2,20,2,,1524,,1828,TW,30,N54334,,124,,,,STL,DCA,719,0,0,1,,0 +1996,2,27,2,733,735,851,859,CO,667,N16301,138,144,119,-8,-2,IAH,DEN,861,5,14,0,,0 +1996,2,23,5,1310,1310,1443,1455,HP,494,N634AW,93,105,76,-12,0,PHX,DEN,602,3,14,0,,0 +1996,3,10,7,835,830,1017,1023,UA,1063,N395UA,102,113,88,-6,5,DEN,PHX,602,4,10,0,,0 +1996,3,2,6,2135,2130,2331,2335,WN,252,N81,56,65,50,-4,5,LAX,PHX,370,2,4,0,,0 +1996,3,23,6,2305,2305,101,105,TW,462,N956U,56,60,45,-4,0,SAN,PHX,304,2,9,0,,0 +1996,3,16,6,1008,1004,1145,1135,DL,312,N294WA,97,91,69,10,4,ATL,PIT,526,6,22,0,,0 +1996,3,19,2,141,1920,244,2049,US,1881,N271AU,63,89,48,355,381,EWR,PIT,319,5,10,0,,0 +1996,3,29,5,,955,,1109,US,1488,UNKNOW,,74,,,,RIC,PIT,259,0,0,1,,0 +1996,3,4,1,1158,1150,1318,1314,US,870,N864US,80,84,68,4,8,PIT,PVD,467,4,8,0,,0 +1996,3,6,3,1420,1420,1418,1440,WN,863,N320,58,80,49,-22,0,BOI,RNO,335,2,7,0,,0 +1996,3,12,2,1352,1353,1520,1525,DL,205,N631DL,88,92,70,-5,-1,ATL,RSW,515,4,14,0,,0 +1996,3,18,1,900,900,1013,1020,WN,1700,N617,73,80,66,-7,0,OAK,SAN,446,2,5,0,,0 +1996,3,30,6,929,920,1031,1026,AA,1918,N285AA,62,66,46,5,9,DFW,SAT,247,7,9,0,,0 +1996,3,17,7,1850,1845,2036,2026,US,429,N985VJ,106,101,83,10,5,DCA,SDF,474,6,17,0,,0 +1996,3,12,2,1829,1833,2110,2106,AS,193,N772AS,161,153,146,4,-4,LAX,SEA,954,4,11,0,,0 +1996,3,8,5,1450,1450,1542,1545,DL,1473,N483DA,112,115,90,-3,0,SLC,SEA,689,3,19,0,,0 +1996,3,18,1,1157,1200,1424,1407,CO,231,N98876,267,247,241,17,-3,IAH,SFO,1635,6,20,0,,0 +1996,3,3,7,1220,1215,1516,1449,UA,691,N588UA,296,274,277,27,5,ORD,SFO,1846,4,15,0,,0 +1996,3,19,2,1125,1125,1328,1350,TW,177,N9407R,243,265,228,-22,0,STL,SFO,1736,4,11,0,,0 +1996,3,13,3,1720,1720,1830,1835,WN,761,N688,70,75,59,-5,0,S,SJC,342,2,9,0,,0 +1996,3,3,7,,845,,1037,DL,1945,N307WA,,172,,,,DFW,SLC,988,0,0,1,,0 +1996,3,30,6,1400,1400,1610,1615,WN,1775,N505,70,75,58,-5,0,RNO,SLC,422,2,10,0,,0 +1996,3,5,2,1542,1515,1713,1655,WN,1728,N693,91,100,76,18,27,SEA,SMF,605,2,13,0,,0 +1996,3,25,1,915,905,1130,1110,DL,1167,N989DL,135,125,113,20,10,CVG,SRQ,812,3,19,0,,0 +1996,3,8,5,1715,1718,1918,1912,AA,1854,N2CVAA,123,114,90,6,-3,DFW,STL,551,6,27,0,,0 +1996,3,9,6,1630,1630,1733,1743,TW,584,N491SA,63,73,57,-10,0,LNK,STL,370,4,2,0,,0 +1996,3,21,4,825,744,928,855,UA,1637,N338UA,63,71,45,33,41,ORD,STL,258,5,13,0,,0 +1996,3,9,6,1901,1830,2046,2012,US,834,N919VJ,105,102,81,34,31,CLT,SWF,571,6,18,0,,0 +1996,3,3,7,1855,1855,1950,1950,WN,1867,N95,55,55,39,0,0,FLL,TPA,197,5,11,0,,0 +1996,3,7,4,1949,1945,2127,2132,UA,589,N7293U,98,107,83,-5,4,DEN,TUS,639,4,11,0,,0 +1996,3,9,6,640,640,725,730,WN,1745,N387,105,110,87,-5,0,SLC,LAX,590,7,11,0,,0 +1996,3,28,4,1105,1100,1242,1239,DL,712,N499DA,97,99,75,3,5,CVG,LGA,585,9,13,0,,0 +1996,3,4,1,601,600,843,900,AA,398,N407AA,102,120,87,-17,1,ORD,LGA,733,4,11,0,,0 +1996,3,16,6,1150,1150,1257,1255,WN,71,N332,67,65,55,2,0,DAL,MAF,319,2,10,0,,0 +1996,3,2,6,1003,1000,1327,1325,WN,456,N521,144,145,130,2,3,PHX,MCI,1044,2,12,0,,0 +1996,3,12,2,742,740,1005,1014,DL,305,N990DL,143,154,128,-9,2,EWR,MCO,938,4,11,0,,0 +1996,3,13,3,1515,1515,1633,1630,WN,1263,N662,78,75,63,3,0,B,MDW,395,3,12,0,,0 +1996,3,27,3,1817,1800,1832,1827,NW,825,N912RW,75,87,54,5,17,ATL,MEM,332,4,17,0,,0 +1996,3,28,4,1128,1130,1257,1250,NW,1297,N769NC,89,80,64,7,-2,VPS,MEM,369,9,16,0,,0 +1996,3,10,7,1529,1500,1911,1803,AA,99,N875AA,222,183,168,68,29,JFK,MIA,1090,27,27,0,,0 +1996,3,22,5,2007,2003,2113,2129,TW,237,N922L,66,86,51,-16,4,STL,MKE,317,2,13,0,,0 +1996,3,24,7,1337,1340,1517,1519,NW,321,N295US,160,159,128,-2,-3,DCA,MSP,931,24,8,0,,0 +1996,3,11,1,1901,1905,2023,2031,NW,220,N8944E,82,86,58,-8,-4,MCI,MSP,393,17,7,0,,0 +1996,3,18,1,1148,1150,1741,1726,NW,194,N328US,233,216,211,15,-2,SAN,MSP,1532,4,18,0,,0 +1996,3,12,2,1035,1030,1132,1125,WN,898,N63,57,55,48,7,5,HOU,MSY,303,2,7,0,,0 +1996,3,17,7,1510,1400,1619,1510,WN,1508,N365,69,70,54,69,70,LAX,OAK,337,3,12,0,,0 +1996,3,7,4,935,935,1114,1048,CO,1741,N12539,99,73,62,26,0,IAH,OKC,395,4,33,0,,0 +1996,3,7,4,1429,1431,1436,1439,HP,630,N184AW,67,68,51,-3,-2,PHX,ONT,325,3,13,0,,0 +1996,3,5,2,1901,1830,2103,2012,AA,875,N294AA,182,162,153,51,31,BOS,ORD,867,19,10,0,,0 +1996,3,5,2,1303,1305,1620,1624,AA,1112,N587AA,137,139,119,-4,-2,DEN,ORD,888,5,13,0,,0 +1996,3,28,4,2033,2022,2124,2115,UA,427,N539UA,111,113,90,9,11,IAD,ORD,589,10,11,0,,0 +1996,3,12,2,1450,1450,1611,1612,UA,1460,N9040U,81,82,65,-1,0,MCI,ORD,403,7,9,0,,0 +1996,3,16,6,955,955,1054,1105,AA,273,N640AA,119,130,102,-11,0,PHL,ORD,678,8,9,0,,0 +1996,3,3,7,1918,1850,49,41,UA,152,N530UA,211,231,190,8,28,SFO,ORD,1846,4,17,0,,0 +1996,3,8,5,950,900,1019,930,DL,1438,N489DA,29,30,21,49,50,RIC,ORF,75,2,6,0,,0 +1996,3,31,7,1949,1940,2201,2153,DL,1876,N531DA,132,133,103,8,9,LAX,PDX,834,2,27,0,,0 +1996,3,6,3,845,730,1024,850,US,889,N248US,99,80,59,94,75,BOS,PHL,280,8,32,0,,0 +1996,3,6,3,820,625,1056,907,AA,1856,N719AA,96,102,80,109,115,ORD,PHL,678,5,11,0,,0 +1996,3,9,6,1805,1805,2052,2050,AA,2040,N549AA,107,105,76,2,0,ABQ,DFW,569,17,14,0,,0 +1996,3,29,5,706,705,841,846,AA,1591,N2DCAA,155,161,134,-5,1,DAY,DFW,861,7,14,0,,0 +1996,3,29,5,757,800,854,906,CO,1774,N69523,57,66,41,-12,-3,IAH,DFW,224,4,12,0,,0 +1996,3,13,3,1239,1240,1428,1435,DL,877,N404DA,169,175,147,-7,-1,MIA,DFW,1121,6,16,0,,0 +1996,3,7,4,751,750,950,952,AA,1873,N722AA,179,182,162,-2,1,RDU,DFW,1062,4,13,0,,0 +1996,3,12,2,1955,1955,2207,2153,TW,655,N937F,132,118,87,14,0,STL,DFW,551,5,40,0,,0 +1996,3,28,4,1203,1205,1256,1304,NW,1420,N983US,53,59,32,-8,-2,CMH,DTW,155,13,8,0,,0 +1996,3,17,7,1612,1612,1744,1810,NW,1593,N344NW,92,118,75,-26,0,LGA,DTW,501,8,9,0,,0 +1996,3,3,7,52,45,613,618,NW,256,N531US,201,213,184,-5,7,PHX,DTW,1671,5,12,0,,0 +1996,3,20,3,2102,2010,2150,2100,WN,351,N680,108,110,96,50,52,HOU,ELP,677,3,9,0,,0 +1996,3,7,4,1507,1500,1711,1651,DL,948,N629DL,124,111,97,20,7,CVG,EWR,569,8,19,0,,0 +1996,3,31,7,725,725,1050,1055,NW,770,N9346,145,150,129,-5,0,MSP,EWR,1008,6,10,0,,0 +1996,3,9,6,1607,1600,1648,1637,US,729,N897US,41,37,23,11,7,CLT,FAY,118,6,12,0,,0 +1996,3,19,2,1140,1140,1254,1258,UA,1035,N919UA,134,138,122,-4,0,DEN,GEG,836,2,10,0,,0 +1996,3,24,7,1735,1735,1938,1940,CO,1092,N14212,123,125,108,-2,0,MIA,GSO,710,2,13,0,,0 +1996,3,20,3,700,700,750,755,WN,1,N342,50,55,37,-5,0,DAL,HOU,239,3,10,0,,0 +1996,3,2,6,1334,1335,1637,1639,UA,1518,N346UA,123,124,102,-2,-1,ORD,HPN,738,8,13,0,,0 +1996,3,2,6,1846,1628,25,2215,DL,1426,N676DL,219,227,194,130,138,SLC,IAD,1827,8,17,0,,0 +1996,3,19,2,1148,1150,1337,1346,CO,1749,N73380,169,176,149,-9,-2,DTW,IAH,1076,11,9,0,,0 +1996,3,29,5,1900,1855,2139,2130,UA,1431,N981UA,159,155,134,9,5,ORD,IAH,925,4,21,0,,0 +1996,3,5,2,1025,1023,1445,1446,UA,1080,N378UA,140,143,116,-1,2,DEN,IND,977,7,17,0,,0 +1996,3,16,6,1225,1210,1442,1425,NW,468,N607NW,137,135,113,17,15,DTW,JAX,814,5,19,0,,0 +1996,3,30,6,1023,1017,1652,1635,DL,1424,N635DL,269,258,233,17,6,SLC,JFK,1989,16,20,0,,0 +1996,3,11,1,1505,1505,1604,1605,UA,2031,N203UA,59,60,43,-1,0,LAX,LAS,236,4,12,0,,0 +1996,3,21,4,656,645,754,747,HP,85,N640AW,58,62,46,7,11,SAN,LAS,258,4,8,0,,0 +1996,3,31,7,1745,1730,1853,1845,UA,1193,N1829U,128,135,112,8,15,DEN,LAX,862,5,11,0,,0 +1996,3,13,3,1248,1250,1403,1358,UA,2214,N917UA,75,68,41,5,-2,LAS,LAX,236,7,27,0,,0 +1996,3,20,3,1305,1300,1515,1510,DL,1974,N513DA,130,130,114,5,5,PDX,LAX,834,10,6,0,,0 +1996,3,3,7,1333,1330,1611,1615,UA,224,N9017U,98,105,80,-4,3,ORD,ABE,654,3,15,0,,0 +1996,3,2,6,702,705,820,830,NW,1518,N914RW,78,85,61,-10,-3,DTW,ALB,488,6,11,0,,0 +1996,3,10,7,1341,1335,1624,1622,DL,1055,N120DL,163,167,141,2,6,BOS,ATL,946,6,16,0,,0 +1996,3,28,4,1806,1730,2120,2020,DL,586,N111DN,134,110,104,60,36,DFW,ATL,732,9,21,0,,0 +1996,3,7,4,734,735,834,839,DL,1461,N672DL,60,64,44,-5,-1,JAX,ATL,270,9,7,0,,0 +1996,3,6,3,842,835,1115,1050,DL,684,N102DA,93,75,71,25,7,MSY,ATL,425,7,15,0,,0 +1996,3,19,2,600,605,846,912,DL,392,N283WA,106,127,96,-26,-5,SAT,ATL,874,6,4,0,,0 +1996,3,16,6,2043,2015,2152,2114,AA,1403,N2BVAA,69,59,33,38,28,DFW,AUS,190,4,32,0,,0 +1996,3,13,3,1013,1015,1319,1310,AA,290,N2AXAA,126,115,107,9,-2,ORD,BDL,783,4,15,0,,0 +1996,3,27,3,2152,2140,2208,2200,US,698,N890US,76,80,54,8,12,CLT,B,329,7,15,0,,0 +1996,3,5,2,1350,1347,1625,1612,DL,686,N782DL,155,145,129,13,3,ATL,BOS,946,7,19,0,,0 +1996,3,28,4,2157,2200,620,624,AA,192,N626AA,323,324,296,-4,-3,LAX,BOS,2611,6,21,0,,0 +1996,3,31,7,1229,1225,1316,1253,DL,1115,N920DE,107,88,74,23,4,ATL,BTR,449,4,29,0,,0 +1996,3,20,3,1751,1750,1854,1853,UA,2137,N381UA,63,63,50,1,1,SFO,BUR,326,2,11,0,,0 +1996,3,5,2,1921,1925,2144,2159,AA,448,N871AA,143,154,114,-15,-4,MIA,BWI,946,5,24,0,,0 +1996,3,18,1,1140,1140,1241,1246,TW,488,N490SA,61,66,37,-5,0,STL,CID,228,3,21,0,,0 +1996,3,31,7,1423,1425,1629,1632,CO,1244,N15255,66,67,50,-3,-2,MKE,CLE,328,4,12,0,,0 +1996,3,1,5,1938,1919,2104,2045,US,1852,N898US,86,86,74,19,19,CLE,CLT,430,5,7,0,,0 +1996,3,30,6,1619,1610,1749,1747,US,2164,N602AU,90,97,69,2,9,MCO,CLT,468,5,16,0,,0 +1996,3,25,1,802,730,1042,1007,US,1872,N935VJ,100,97,77,35,32,STL,CLT,575,5,18,0,,0 +1996,3,16,6,1230,1232,1306,1308,UA,1041,N995UA,36,36,16,-2,-2,DEN,COS,72,3,17,0,,0 +1996,3,19,2,700,700,810,803,DL,741,N911DL,70,63,55,7,0,GRR,CVG,268,5,10,0,,0 +1996,3,10,7,1430,1430,2149,2141,DL,946,N482DA,259,251,235,8,0,SFO,CVG,2036,7,17,0,,0 +1996,3,17,7,1505,1505,1559,1605,WN,165,N601,54,60,44,-6,0,MAF,DAL,319,3,7,0,,0 +1996,3,29,5,2000,1958,2107,2100,HP,262,N622AW,67,62,50,7,2,CMH,DCA,322,4,13,0,,0 +1996,3,28,4,1214,1214,1505,1456,UA,612,N424UA,111,102,84,9,0,ORD,DCA,612,11,16,0,,0 +1996,3,17,7,1918,1920,2010,2021,UA,1576,N978UA,112,121,91,-11,-2,DFW,DEN,641,8,13,0,,0 +1996,3,3,7,1416,1415,1731,1737,UA,1794,N301UA,135,142,115,-6,1,OAK,DEN,957,8,12,0,,0 +1996,3,27,3,1800,1700,2106,2008,UA,1504,N401UA,126,128,103,58,60,S,DEN,846,7,16,0,,0 +1996,4,14,7,1845,1830,1936,1930,WN,595,N395,51,60,41,6,15,LAS,PHX,256,4,6,0,,0 +1996,4,18,4,952,950,1126,1123,UA,345,N1832U,214,213,196,3,2,ORD,PHX,1440,4,14,0,,0 +1996,4,3,3,1515,1515,1650,1650,WN,1154,N351,155,155,143,0,0,TUL,PHX,935,5,7,0,,0 +1996,4,16,2,1141,1040,1234,1138,NW,700,N922RW,53,58,38,56,61,DTW,PIT,201,7,8,0,,0 +1996,4,19,5,1011,1007,1123,1114,US,506,N442US,72,67,49,9,4,PHL,PIT,267,6,17,0,,0 +1996,4,13,6,1655,1655,1830,1842,NW,1446,N767NC,95,107,77,-12,0,DTW,PVD,614,4,14,0,,0 +1996,4,14,7,1035,1035,1139,1149,US,1923,N254AU,64,74,45,-10,0,LGA,RIC,292,5,14,0,,0 +1996,4,11,4,1444,1445,1519,1523,NW,676,N941N,35,38,18,-4,-1,MSP,RST,76,4,13,0,,0 +1996,4,30,2,1800,1800,1912,1920,WN,987,N91,72,80,64,-8,0,OAK,SAN,446,2,6,0,,0 +1996,4,9,2,1920,1920,2020,2026,AA,2272,N587AA,60,66,42,-6,0,DFW,SAT,247,4,14,0,,0 +1996,4,11,4,1222,1225,1332,1343,NW,1493,N93S,70,78,50,-11,-3,DTW,SDF,306,7,13,0,,0 +1996,4,24,3,951,951,1225,1223,AS,305,N955AS,154,152,136,2,0,LAX,SEA,954,2,16,0,,0 +1996,4,30,2,850,850,947,945,DL,1947,N541DA,117,115,100,2,0,SLC,SEA,689,5,12,0,,0 +1996,4,23,2,1627,1630,1941,1946,AA,35,N303AA,374,376,349,-5,-3,JFK,SFO,2586,4,21,0,,0 +1996,4,27,6,1824,1805,1944,1942,UA,2061,N383UA,80,97,68,2,19,PDX,SFO,550,3,9,0,,0 +1996,4,5,5,1642,1643,1813,1818,TW,471,N935L,91,95,77,-5,-1,STL,SHV,476,3,11,0,,0 +1996,4,9,2,927,930,1318,1320,US,1969,N778AU,231,230,212,-2,-3,BWI,SJU,1565,7,12,0,,0 +1996,4,30,2,1311,1315,1525,1533,DL,1898,N660DL,74,78,53,-8,-4,LAS,SLC,368,7,14,0,,0 +1996,4,17,3,1030,1030,1256,1254,DL,1957,N308WA,86,84,69,2,0,SMF,SLC,532,3,14,0,,0 +1996,4,1,1,1853,1855,2034,2050,NW,205,N316US,281,295,259,-16,-2,DTW,S,1960,4,18,0,,0 +1996,4,2,2,830,825,952,940,WN,1565,N312,82,75,66,12,5,BHM,STL,410,2,14,0,,0 +1996,4,9,2,822,815,1012,1000,TW,257,N54349,170,165,150,12,7,FLL,STL,1056,7,13,0,,0 +1996,4,24,3,1954,1955,2102,2108,NW,945,N959N,68,73,48,-6,-1,MEM,STL,256,9,11,0,,0 +1996,4,5,5,1818,1820,1814,1827,TW,371,N417EA,56,67,48,-13,-2,SDF,STL,254,2,6,0,,0 +1996,4,11,4,2319,2319,35,25,DL,664,N2821W,76,66,54,10,0,ATL,TPA,406,5,17,0,,0 +1996,4,18,4,1849,1850,2206,2219,TW,204,N917TW,137,149,104,-13,-1,STL,TPA,869,3,30,0,,0 +1996,4,16,2,,1105,,1154,US,1821,UNKNOW,,49,,,,CLT,TYS,177,0,0,1,,0 +1996,4,8,1,2038,2030,2225,2231,DL,578,N920DL,107,121,90,-6,8,ATL,LGA,761,6,11,0,,0 +1996,4,4,4,1418,1420,1832,1836,CO,1828,N58606,194,196,175,-4,-2,IAH,LGA,1416,5,14,0,,0 +1996,4,13,6,915,915,1016,1010,WN,8,N26,61,55,50,6,0,DAL,LIT,296,3,8,0,,0 +1996,4,8,1,809,735,1018,954,US,204,N559AU,189,199,161,24,34,LGA,MCI,1107,5,23,0,,0 +1996,4,8,1,851,850,1050,1044,DL,903,N613DL,119,114,101,6,1,CVG,MCO,756,5,13,0,,0 +1996,4,12,5,1026,1025,1326,1322,US,1591,N225US,180,177,154,4,1,PVD,MCO,1073,19,7,0,,0 +1996,4,2,2,1316,1310,1421,1425,WN,1051,N104,65,75,57,-4,6,OMA,MDW,423,3,5,0,,0 +1996,4,6,6,1112,1115,1247,1249,NW,475,N960N,95,94,80,-2,-3,ORD,MEM,491,3,12,0,,0 +1996,4,8,1,1653,1645,1953,1946,NW,991,N953N,180,181,160,7,8,DTW,MIA,1145,5,15,0,,0 +1996,4,11,4,2001,2005,2217,2230,CO,1863,N27610,136,145,117,-13,-4,IAH,MKE,984,4,15,0,,0 +1996,4,5,5,700,700,746,758,NW,707,N920RW,106,118,93,-12,0,CMH,MSP,627,5,8,0,,0 +1996,4,4,4,1151,1155,1335,1351,NW,505,N201US,164,176,146,-16,-4,LGA,MSP,1020,5,13,0,,0 +1996,4,7,7,1307,1310,1347,1350,NW,774,N926RC,40,40,31,-3,-3,RST,MSP,76,4,5,0,,0 +1996,4,18,4,1604,1600,1657,1700,WN,625,N335,53,60,45,-3,4,HOU,MSY,303,2,6,0,,0 +1996,4,7,7,1829,1700,1926,1810,WN,1417,N373,57,70,47,76,89,LAX,OAK,337,2,8,0,,0 +1996,4,12,5,930,935,1037,1048,CO,1741,N12508,67,73,52,-11,-5,IAH,OKC,395,3,12,0,,0 +1996,4,15,1,1605,1605,1723,1711,HP,2632,N147AW,78,66,53,12,0,PHX,ONT,325,4,21,0,,0 +1996,4,19,5,1726,1730,1941,1916,AA,1849,N295AA,195,166,139,25,-4,BOS,ORD,867,35,21,0,,0 +1996,4,4,4,1800,1757,2115,2115,UA,1216,N368UA,135,138,113,0,3,DEN,ORD,888,11,11,0,,0 +1996,4,16,2,1703,1700,1922,1921,UA,1642,N982UA,139,141,128,1,3,IAH,ORD,925,5,6,0,,0 +1996,4,21,7,1946,1950,2118,2135,NW,474,N675MC,92,105,79,-17,-4,MEM,ORD,491,4,9,0,,0 +1996,4,10,3,1725,1725,2239,2230,HP,8,N902AW,194,185,172,9,0,PHX,ORD,1440,5,17,0,,0 +1996,4,20,6,700,700,1248,1248,UA,1076,N7275U,228,228,205,0,0,SMF,ORD,1781,8,15,0,,0 +1996,4,23,2,1311,1308,1701,1647,DL,1670,N926DL,170,159,134,14,3,DFW,PBI,1103,4,32,0,,0 +1996,4,27,6,1400,1352,1440,1436,AS,516,N940AS,40,44,25,4,8,SEA,PDX,129,2,13,0,,0 +1996,4,5,5,2100,2021,101,22,AA,1180,N519AA,181,181,145,39,39,DFW,PHL,1302,5,31,0,,0 +1996,4,17,3,1257,1255,1534,1528,US,1028,N823US,157,153,141,6,2,RSW,PHL,992,5,11,0,,0 +1996,4,18,4,1400,1400,1511,1502,AA,736,N468AA,71,62,52,9,0,AUS,DFW,190,12,7,0,,0 +1996,4,28,7,937,940,1137,1142,NW,691,N3322L,180,182,155,-5,-3,DTW,DFW,987,6,19,0,,0 +1996,4,4,4,710,710,1204,1216,DL,1262,N511DA,174,186,153,-12,0,LAX,DFW,1235,6,15,0,,0 +1996,4,7,7,1759,1800,2032,2026,AA,2249,N578AA,153,146,111,6,-1,ORD,DFW,802,32,10,0,,0 +1996,4,3,3,633,635,1204,1202,AA,1752,N210AA,211,207,181,2,-2,SFO,DFW,1464,11,19,0,,0 +1996,4,26,5,1720,1705,1909,1859,DL,1026,N106DA,109,114,89,10,15,ATL,DTW,594,3,17,0,,0 +1996,4,20,6,707,710,759,753,NW,484,N720RC,52,43,29,6,-3,GRR,DTW,120,11,12,0,,0 +1996,4,18,4,2143,2145,12,14,NW,360,N335NW,89,89,71,-2,-2,MSP,DTW,528,4,14,0,,0 +1996,4,2,2,1259,1300,1545,1548,NW,483,N721RW,166,168,145,-3,-1,TPA,DTW,983,9,12,0,,0 +1996,4,27,6,603,600,708,716,CO,469,N72830,65,76,46,-8,3,BOS,EWR,200,7,12,0,,0 +1996,4,15,1,1805,1805,2143,2138,CO,1018,N17614,158,153,135,5,0,MCI,EWR,1092,6,17,0,,0 +1996,4,11,4,716,700,1003,935,CO,440,N14871,167,155,151,28,16,TPA,EWR,998,6,10,0,,0 +1996,4,21,7,945,945,1035,1040,WN,1750,N378,50,55,35,-5,0,TPA,FLL,197,5,10,0,,0 +1996,4,12,5,649,645,820,819,CO,1091,N14335,91,94,66,1,4,EWR,GSO,446,3,22,0,,0 +1996,4,19,5,655,655,744,740,WN,8,N394,49,45,37,4,0,CRP,HOU,187,5,7,0,,0 +1996,4,5,5,1343,1345,1514,1524,NW,1150,N8950E,91,99,75,-10,-2,DTW,HPN,505,4,12,0,,0 +1996,4,27,6,2211,2210,532,551,UA,50,N1849U,261,281,244,-19,1,SFO,IAD,2419,3,14,0,,0 +1996,4,18,4,732,738,824,835,DL,1467,N542DA,52,57,33,-11,-6,DFW,IAH,224,5,14,0,,0 +1996,4,4,4,621,620,855,851,CO,1693,N70330,214,211,195,4,1,PHL,IAH,1324,6,13,0,,0 +1996,4,23,2,1727,1719,1940,1924,AA,462,N221AA,133,125,104,16,8,DFW,IND,762,11,18,0,,0 +1996,4,27,6,2042,2045,2343,2354,UA,554,N7276U,121,129,100,-11,-3,ORD,JAX,865,3,18,0,,0 +1996,4,11,4,921,915,1124,1136,UA,41,N1828U,303,321,283,-12,6,SFO,KOA,2367,5,15,0,,0 +1996,4,2,2,2105,2105,2155,2200,WN,538,N512,50,55,42,-5,0,LAX,LAS,236,3,5,0,,0 +1996,4,16,2,840,840,939,925,WN,397,N603,179,165,168,14,0,SAT,LAS,1069,3,8,0,,0 +1996,4,25,4,1233,1235,1336,1354,AA,1223,N573AA,183,199,163,-18,-2,DFW,LAX,1235,11,9,0,,0 +1996,4,5,5,650,650,750,750,WN,1650,N502,60,60,37,0,0,LAS,LAX,236,10,13,0,,0 +1996,4,10,3,2040,2040,2152,2158,UA,2245,N365UA,72,78,59,-6,0,PHX,LAX,370,6,7,0,,0 +1996,4,22,1,1813,1815,1927,1927,UA,505,N998UA,74,72,54,0,-2,DEN,ABQ,349,3,17,0,,0 +1996,4,4,4,2225,2210,2323,2315,WN,62,N605,58,65,45,8,15,DAL,AMA,324,3,10,0,,0 +1996,4,12,5,1719,1705,1832,1814,DL,390,N906DL,73,69,57,18,14,CHS,ATL,259,7,9,0,,0 +1996,4,9,2,1501,1500,1801,1723,CO,1419,N37882,180,143,116,38,1,EWR,ATL,745,7,57,0,,0 +1996,4,29,1,1614,1600,2010,1827,DL,627,N914DL,236,147,202,103,14,LGA,ATL,761,10,24,0,,0 +1996,4,17,3,1607,1605,1748,1742,DL,2073,N902DE,101,97,83,6,2,ORF,ATL,516,11,7,0,,0 +1996,4,4,4,913,910,1059,1036,DL,1188,N917DE,106,86,90,23,3,SRQ,ATL,445,8,8,0,,0 +1996,4,19,5,1013,1010,1246,1241,AA,1491,N2CUAA,153,151,144,5,3,ORD,AUS,978,2,7,0,,0 +1996,4,3,3,1709,1708,1751,1811,US,955,N924VJ,102,123,93,-20,1,BWI,BHM,682,2,7,0,,0 +1996,4,7,7,727,710,825,820,WN,741,N50,58,70,50,5,17,MDW,B,395,2,6,0,,0 +1996,4,1,1,1059,1100,1227,1226,US,1862,N405US,88,86,62,1,-1,DCA,BOS,399,7,19,0,,0 +1996,4,20,6,1347,1345,1702,1702,UA,388,N7458U,135,137,103,0,2,ORD,BOS,867,16,16,0,,0 +1996,4,23,2,1906,1845,2140,1950,US,819,N235US,154,65,47,110,21,PHL,BUF,279,5,102,0,,0 +1996,4,25,4,1841,1835,2004,1950,US,872,N476US,83,75,67,14,6,CLT,BWI,361,7,9,0,,0 +1996,4,28,7,2143,2132,2250,2245,DL,1882,N306WA,67,73,54,5,11,SLC,BZN,347,3,10,0,,0 +1996,4,14,7,1712,1655,1840,1835,CO,1619,N14307,88,100,63,5,17,EWR,CLE,404,2,23,0,,0 +1996,4,15,1,1619,1614,1811,1815,US,238,N276AU,112,121,100,-4,5,BDL,CLT,644,3,9,0,,0 +1996,4,18,4,631,630,739,742,US,1979,N478US,68,72,51,-3,1,IAD,CLT,321,3,14,0,,0 +1996,4,29,1,1640,1520,1725,1608,US,1998,N484US,45,48,32,77,80,RDU,CLT,130,7,6,0,,0 +1996,4,10,3,1930,1930,2128,2130,WN,875,N53,58,60,48,-2,0,MDW,CMH,284,3,7,0,,0 +1996,4,24,3,2036,2035,2126,2125,DL,1809,N921DL,50,50,37,1,1,CLE,CVG,221,5,8,0,,0 +1996,4,17,3,1724,1725,1929,1933,DL,645,N314DA,125,128,108,-4,-1,PVD,CVG,722,6,11,0,,0 +1996,4,14,7,2030,2030,2119,2120,WN,60,N689,49,50,42,-1,0,HOU,DAL,239,2,5,0,,0 +1996,4,15,1,804,800,942,941,US,358,N937VJ,98,101,75,1,4,BOS,DCA,399,8,15,0,,0 +1996,4,3,3,1331,1330,1554,1558,AA,1506,N641AA,143,148,125,-4,1,MIA,DCA,920,3,15,0,,0 +1996,4,20,6,1258,1255,1352,1345,DL,1497,N928DL,174,170,161,7,3,CVG,DEN,1069,5,8,0,,0 +1996,4,30,2,1605,1550,1649,1646,UA,1165,N7261U,104,116,91,3,15,MSP,DEN,680,3,10,0,,0 +1996,4,2,2,1118,1120,1423,1432,UA,1496,N988UA,125,132,112,-9,-2,SMF,DEN,910,5,8,0,,0 +1996,5,10,5,1928,1930,2028,2030,HP,1236,N640AW,60,60,44,-2,-2,LAS,PHX,256,6,10,0,,0 +1996,5,25,6,1325,1325,1459,1506,AA,239,N552AA,214,221,199,-7,0,ORD,PHX,1440,5,10,0,,0 +1996,5,13,1,909,910,1027,1033,TW,169,N54340,198,203,173,-6,-1,STL,PHX,1262,4,21,0,,0 +1996,5,27,1,1941,1940,2046,2032,US,1197,N449US,65,52,38,14,1,DAY,PIT,215,16,11,0,,0 +1996,5,11,6,,720,,1044,US,1450,UNKNOW,,144,,,,MSY,PIT,918,0,0,1,,0 +1996,5,8,3,1052,1054,1109,1113,AS,65,N744AS,17,19,9,-4,-2,WRG,PSG,31,3,5,0,,0 +1996,5,17,5,2115,2110,4,2358,TW,608,N928L,109,108,85,6,5,STL,RDU,667,3,21,0,,0 +1996,5,8,3,950,945,1132,1125,US,1278,N968VJ,102,100,85,7,5,CLT,ROC,573,3,14,0,,0 +1996,5,31,5,1926,1930,2024,2030,HP,863,112,58,60,47,-6,-4,LAS,SAN,258,4,7,0,,0 +1996,5,2,4,1607,1600,1710,1710,WN,1761,N330,63,70,50,0,7,TUS,SAN,367,2,11,0,,0 +1996,5,15,3,1227,1230,1220,1220,NW,688,N930RC,53,50,36,0,-3,DTW,SBN,157,3,14,0,,0 +1996,5,18,6,1238,1220,1431,1405,NW,265,N530US,293,285,264,26,18,DTW,SEA,1927,5,24,0,,0 +1996,5,21,2,1629,1629,1801,1810,AS,603,N938AS,92,101,80,-9,0,RNO,SEA,564,3,9,0,,0 +1996,5,16,4,1913,1720,2101,1854,UA,1653,N301UA,168,154,151,127,113,DEN,SFO,967,6,11,0,,0 +1996,5,21,2,1311,1217,1524,1345,UA,2398,N399UA,133,88,115,99,54,LAX,SFO,337,3,15,0,,0 +1996,5,31,5,1505,1505,1620,1630,WN,320,N374,75,85,67,-10,0,SAN,SFO,447,2,6,0,,0 +1996,5,10,5,1800,1800,1858,1905,WN,1126,N325,58,65,49,-7,0,ONT,SJC,333,3,6,0,,0 +1996,5,21,2,1004,1006,1200,1155,DL,1461,N636DL,236,229,211,5,-2,ATL,SLC,1589,5,20,0,,0 +1996,5,14,2,649,650,808,807,DL,2038,N308DL,139,137,126,1,-1,OMA,SLC,839,4,9,0,,0 +1996,5,6,1,2040,2040,2155,2155,WN,810,N376,75,75,61,0,0,LAX,SMF,373,3,11,0,,0 +1996,5,8,3,600,600,720,715,HP,661,N314AW,80,75,57,5,0,PHX,S,338,5,18,0,,0 +1996,5,5,7,1902,1825,1934,1853,TW,211,N9402W,92,88,77,41,37,CMH,STL,410,6,9,0,,0 +1996,5,5,7,922,910,1019,1005,WN,653,N51,57,55,45,14,12,IND,STL,229,2,10,0,,0 +1996,5,19,7,1235,1235,1423,1422,TW,541,N978Z,108,107,88,1,0,MSY,STL,604,9,11,0,,0 +1996,5,23,4,1329,1330,1715,1719,TW,138,N918TW,166,169,142,-4,-1,SLC,STL,1156,17,7,0,,0 +1996,5,11,6,2022,2025,2220,2216,DL,201,N405DA,118,111,97,4,-3,CVG,TPA,773,3,18,0,,0 +1996,5,21,2,1542,1455,1655,1615,WN,875,N687,73,80,64,40,47,HOU,TUL,453,2,7,0,,0 +1996,5,3,5,1843,1842,2010,2004,UA,2051,N929UA,87,82,62,6,1,SFO,LAX,337,8,17,0,,0 +1996,5,24,5,1331,1330,1431,1429,DL,1835,N474DA,60,59,46,2,1,BOS,LGA,185,3,11,0,,0 +1996,5,29,3,1537,1435,1830,1705,DL,1160,N903DE,173,150,133,85,62,MCO,LGA,950,7,33,0,,0 +1996,5,21,2,1945,1942,2047,2045,DL,1688,N956DL,62,63,46,2,3,DFW,LIT,304,5,11,0,,0 +1996,5,9,4,2318,1945,142,2105,WN,835,N24,144,80,69,277,213,MDW,MCI,405,5,70,0,,0 +1996,5,10,5,1041,1045,1243,1255,DL,1805,N900DE,122,130,104,-12,-4,DCA,MCO,759,6,12,0,,0 +1996,5,14,2,833,835,1041,1053,US,944,N390US,128,138,104,-12,-2,PIT,MCO,834,4,20,0,,0 +1996,5,15,3,2128,2130,2242,2248,NW,1076,N763NC,74,78,54,-6,-2,MSP,MDW,349,4,16,0,,0 +1996,5,16,4,1129,1130,1258,1247,NW,820,N203US,89,77,70,11,-1,MSY,MEM,349,3,16,0,,0 +1996,5,18,6,2023,2025,2357,4,AA,1158,N731AA,154,159,133,-7,-2,DFW,MIA,1121,4,17,0,,0 +1996,5,23,4,1026,1015,1115,1116,US,1039,N980VJ,109,121,95,-1,11,CLT,MKE,651,3,11,0,,0 +1996,5,14,2,831,830,1033,1002,NW,189,N320US,182,152,163,31,1,BWI,MSP,936,3,16,0,,0 +1996,5,29,3,1431,1430,1718,1708,CO,542,N12327,167,158,144,10,1,IAH,MSP,1034,4,19,0,,0 +1996,5,25,6,1714,1715,1902,1908,NW,185,N349NW,168,173,147,-6,-1,PHL,MSP,980,6,15,0,,0 +1996,5,31,5,1715,1714,1830,1840,AA,2016,N564AA,75,86,59,-10,1,DFW,MSY,448,3,13,0,,0 +1996,5,9,4,1235,1235,1355,1400,WN,692,N352,80,85,67,-5,0,LAS,OAK,407,3,10,0,,0 +1996,5,6,1,2035,2035,2148,2152,AS,479,N764AS,73,77,63,-4,0,S,OAK,371,4,6,0,,0 +1996,5,16,4,1135,1135,1239,1243,UA,425,N937UA,124,128,111,-4,0,DEN,ONT,819,2,11,0,,0 +1996,5,3,5,1005,1005,1056,1111,DL,1920,N375DL,111,126,90,-15,0,ATL,ORD,606,5,16,0,,0 +1996,5,20,1,1526,1450,1540,1501,DL,1230,N922DL,74,71,43,39,36,CVG,ORD,264,7,24,0,,0 +1996,5,9,4,842,830,1020,947,UA,641,N9015U,158,137,121,33,12,EWR,ORD,719,6,31,0,,0 +1996,5,17,5,859,900,1018,1018,AA,313,N520AA,139,138,111,0,-1,LGA,ORD,733,7,21,0,,0 +1996,5,22,3,758,800,904,913,UA,1876,N9039U,66,73,50,-9,-2,MSP,ORD,334,7,9,0,,0 +1996,5,23,4,1512,1337,2047,1926,UA,252,N529UA,215,229,194,81,95,SAN,ORD,1723,11,10,0,,0 +1996,5,13,1,1346,1344,1514,1515,DL,638,N908DE,88,91,68,-1,2,ATL,ORF,516,5,15,0,,0 +1996,5,11,6,1320,1320,1416,1425,WN,595,N614,56,65,49,-9,0,GEG,PDX,279,1,6,0,,0 +1996,5,11,6,732,730,924,924,US,311,N912VJ,112,114,98,0,2,ATL,PHL,665,3,11,0,,0 +1996,5,19,7,701,700,916,925,US,1868,N373US,135,145,117,-9,1,MCO,PHL,861,4,14,0,,0 +1996,5,24,5,1710,1710,1729,1730,HP,416,N304AW,139,140,126,-1,0,AUS,PHX,872,3,10,0,,0 +1996,5,29,3,1628,1628,1934,1939,AA,1557,N291AA,246,251,227,-5,0,BOS,DFW,1562,9,10,0,,0 +1996,5,9,4,705,705,1226,1208,AA,1560,N488AA,201,183,179,18,0,FAT,DFW,1313,9,13,0,,0 +1996,5,15,3,1305,1305,1439,1447,AA,580,N2CA,94,102,71,-8,0,MCI,DFW,460,15,8,0,,0 +1996,5,22,3,1212,1210,1351,1405,DL,772,N919DL,159,175,142,-14,2,PBI,DFW,1103,7,10,0,,0 +1996,5,20,1,1323,1325,1834,1844,AA,2202,N493AA,191,199,167,-10,-2,SJC,DFW,1438,12,12,0,,0 +1996,5,19,7,1144,1145,1402,1422,NW,1734,N960N,78,97,65,-20,-1,B,DTW,457,7,6,0,,0 +1996,5,18,6,952,955,1131,1137,NW,273,N8929E,99,102,82,-6,-3,HPN,DTW,505,5,12,0,,0 +1996,5,20,1,1828,1830,2154,2122,NW,762,N162US,146,112,101,32,-2,MSP,DTW,528,13,32,0,,0 +1996,5,12,7,1753,1750,1926,1921,NW,1540,N3312L,93,91,69,5,3,TYS,DTW,443,17,7,0,,0 +1996,5,24,5,1504,1500,1630,1620,CO,1217,N17317,86,80,58,10,4,BOS,EWR,200,14,14,0,,0 +1996,5,19,7,1319,1300,2108,2112,UA,80,N516UA,289,312,263,-4,19,LAX,EWR,2454,8,18,0,,0 +1996,5,4,6,1523,1520,1844,1848,TW,32,N916TW,141,148,127,-4,3,STL,EWR,872,4,10,0,,0 +1996,5,25,6,820,820,908,915,WN,1652,N80,48,55,38,-7,0,TPA,FLL,197,3,7,0,,0 +1996,5,22,3,1321,1320,1424,1420,CO,1053,N15255,63,60,49,4,1,DCA,GSO,248,4,10,0,,0 +1996,5,8,3,1355,1355,1536,1550,WN,360,N619,101,115,93,-14,0,B,HOU,670,2,6,0,,0 +1996,5,14,2,1510,1510,1705,1715,WN,759,N73,115,125,97,-10,0,STL,HOU,687,5,13,0,,0 +1996,5,21,2,1242,1245,1603,1609,UA,1878,N317UA,141,144,123,-6,-3,MSY,IAD,954,6,12,0,,0 +1996,5,17,5,1722,1720,1828,1831,AA,2065,N2CPAA,66,71,40,-3,2,DFW,IAH,224,6,20,0,,0 +1996,5,21,2,1642,1645,1754,1802,CO,1926,N43537,72,77,60,-8,-3,OKC,IAH,395,6,6,0,,0 +1996,5,2,4,2013,2015,2057,2105,US,1219,N493US,44,50,29,-8,-2,CLT,ILM,185,4,11,0,,0 +1996,5,1,3,1523,1521,1633,1625,DL,264,N106DA,70,64,46,8,2,ATL,JAX,270,4,20,0,,0 +1996,5,11,6,749,745,1533,1549,UA,300,N577UA,284,304,265,-16,4,SEA,JFK,2421,5,14,0,,0 +1996,5,12,7,1200,1200,1257,1310,WN,320,N332,177,190,166,-13,0,HOU,LAS,1235,2,9,0,,0 +1996,5,8,3,2315,2315,29,14,HP,352,N311AW,74,59,42,15,0,PHX,LAS,256,26,6,0,,0 +1996,5,11,6,1405,1405,1454,1500,WN,789,N388,109,115,97,-6,0,ABQ,LAX,677,6,6,0,,0 +1996,5,17,5,1927,1930,2209,2230,AA,29,N304AA,342,360,317,-21,-3,JFK,LAX,2475,4,21,0,,0 +1996,5,27,1,1849,1830,2111,2054,AA,41,N5CSAA,262,264,236,17,19,ORD,LAX,1745,15,11,0,,0 +1996,5,28,2,1702,1630,1934,1904,UA,1175,N358UA,152,154,132,30,32,SEA,LAX,954,8,12,0,,0 +1996,5,21,2,1100,1030,1417,1340,WN,962,N311,137,130,119,37,30,SFO,ABQ,896,3,15,0,,0 +1996,5,22,3,1722,1720,1812,1804,DL,1478,N913DL,50,44,31,8,2,AGS,ATL,143,7,12,0,,0 +1996,5,1,3,1607,1600,1756,1746,DL,1273,N636DL,109,106,92,10,7,DCA,ATL,547,5,12,0,,0 +1996,5,6,1,551,550,731,737,DL,1442,N2811W,40,47,29,-6,1,HSV,ATL,151,4,7,0,,0 +1996,5,8,3,2028,2030,2208,2210,DL,362,N1734D,100,100,79,-2,-2,MIA,ATL,595,10,11,0,,0 +1996,5,3,5,1755,1755,1954,1958,DL,1620,N915DL,59,63,46,-4,0,PNS,ATL,272,6,7,0,,0 +1996,5,25,6,1334,1335,1627,1624,DL,1917,N328DL,113,109,101,3,-1,TUL,ATL,674,4,8,0,,0 +1996,5,19,7,1454,1500,1703,1720,NW,1512,N9344,69,80,55,-17,-6,MSP,AZO,426,4,10,0,,0 +1996,5,29,3,1502,1500,1545,1546,US,527,N230AU,103,106,92,-1,2,PIT,BHM,598,3,8,0,,0 +1996,5,4,6,946,947,1016,1022,US,224,N918VJ,90,95,71,-6,-1,PIT,B,462,5,14,0,,0 +1996,5,23,4,1159,1205,1347,1354,NW,382,N321US,108,109,83,-7,-6,DTW,BOS,632,7,18,0,,0 +1996,5,21,2,831,830,944,944,US,326,N263AU,73,74,49,0,1,PHL,BOS,280,5,19,0,,0 +1996,5,19,7,1639,1635,1738,1730,WN,494,N519,59,55,47,8,4,LAS,BUR,223,3,9,0,,0 +1996,5,25,6,1934,1645,2042,1752,HP,246,N324AW,68,67,52,170,169,CMH,BWI,336,7,9,0,,0 +1996,5,24,5,1925,1925,2026,2017,DL,1796,N987DL,61,52,32,9,0,ATL,CAE,191,4,25,0,,0 +1996,5,17,5,646,650,821,822,CO,1623,N83870,95,92,73,-1,-4,EWR,CLE,404,5,17,0,,0 +1996,5,8,3,1358,1357,1545,1549,US,1091,N287AU,107,112,93,-4,1,BDL,CLT,644,7,7,0,,0 +1996,5,12,7,912,910,1032,1025,US,1505,N285AU,80,75,60,7,2,IAD,CLT,321,6,14,0,,0 +1996,5,11,6,1855,1818,1936,1905,US,426,N897US,41,47,27,31,37,RDU,CLT,130,4,10,0,,0 +1996,5,5,7,1355,1355,1614,1605,HP,246,N138AW,139,130,124,9,0,MCO,CMH,802,3,12,0,,0 +1996,5,10,5,600,600,809,814,DL,1779,N680DA,129,134,114,-5,0,BOS,CVG,752,5,10,0,,0 +1996,5,4,6,1820,1740,1951,1910,DL,2093,N328DL,91,90,77,41,40,ORF,CVG,485,6,8,0,,0 +1996,5,4,6,900,900,949,955,WN,12,N510,49,55,41,-6,0,HOU,DAL,239,3,5,0,,0 +1996,5,4,6,1429,1259,1647,1510,TW,228,N977Z,78,71,55,97,90,STL,DAY,338,4,19,0,,0 +1996,5,16,4,1033,1030,1136,1132,DL,1749,N414DA,63,62,39,4,3,LGA,DCA,214,14,10,0,,0 +1996,5,24,5,902,900,1033,1041,UA,1629,N976UA,151,161,137,-8,2,B,DEN,1013,8,6,0,,0 +1996,5,3,5,931,930,1229,1249,UA,1192,N988UA,118,139,102,-20,1,LAX,DEN,862,3,13,0,,0 +1996,5,31,5,616,610,936,937,UA,404,N530UA,140,147,126,-1,6,SEA,DEN,1024,4,10,0,,0 +1996,6,5,3,1810,1740,2037,2006,HP,68,N906AW,327,326,283,31,30,EWR,PHX,2133,4,40,0,,0 +1996,6,11,2,1425,1425,1623,1614,HP,2416,N187AW,118,109,102,9,0,OAK,PHX,646,6,10,0,,0 +1996,6,1,6,1445,1445,1511,1519,DL,1449,N503DA,86,94,69,-8,0,SLC,PHX,507,4,13,0,,0 +1996,6,7,5,1852,1842,1933,1925,US,1457,N921VJ,41,43,29,8,10,CLE,PIT,105,3,9,0,,0 +1996,6,6,4,1249,1245,1505,1500,US,1402,N600AU,136,135,111,5,4,MCO,PIT,834,10,15,0,,0 +1996,6,27,4,1704,1705,1702,1708,DL,1863,N920DL,58,63,43,-6,-1,ATL,PNS,272,4,11,0,,0 +1996,6,14,5,1832,1830,2148,2116,AA,1580,N474AA,136,106,98,32,2,ORD,RDU,647,3,35,0,,0 +1996,6,17,1,1214,1215,1258,1301,US,735,N483US,44,46,31,-3,-1,CLT,ROA,155,3,10,0,,0 +1996,6,29,6,1717,1710,1919,1923,UA,175,N558UA,302,313,272,-4,7,IAD,SAN,2253,2,28,0,,0 +1996,6,3,1,915,915,1029,1035,WN,1552,N337,74,80,66,-6,0,SMF,SAN,480,1,7,0,,0 +1996,6,21,5,2150,2140,2241,2233,US,1525,N820US,51,53,36,8,10,CLT,SAV,213,5,10,0,,0 +1996,6,16,7,1124,1125,1246,1258,UA,1433,N1810U,142,153,126,-12,-1,DEN,SEA,1024,3,13,0,,0 +1996,6,9,7,19,2205,227,19,UA,537,N919UA,248,254,224,128,134,ORD,SEA,1721,4,20,0,,0 +1996,6,28,5,1402,1405,1502,1515,UA,2410,N302UA,60,70,51,-13,-3,BUR,SFO,326,2,7,0,,0 +1996,6,12,3,912,912,1020,1035,UA,2014,N303UA,68,83,55,-15,0,LAX,SFO,337,3,10,0,,0 +1996,6,2,7,700,700,821,825,AS,473,N936AS,81,85,65,-4,0,PSP,SFO,421,5,11,0,,0 +1996,6,6,4,935,930,1124,1134,CO,1857,N16617,229,244,209,-10,5,IAH,SJC,1608,5,15,0,,0 +1996,6,16,7,1921,1915,2159,2154,AA,513,N073AA,158,159,130,5,6,MIA,SJU,1045,5,23,0,,0 +1996,6,11,2,1952,1935,2224,2210,WN,1517,N324,92,95,83,14,17,LAX,SLC,590,2,7,0,,0 +1996,6,6,4,1100,1100,1206,1210,WN,885,N376,66,70,53,-4,0,BUR,SMF,358,5,8,0,,0 +1996,6,19,3,1314,1314,1438,1429,AS,340,N767AS,84,75,70,9,0,OAK,S,371,5,9,0,,0 +1996,6,17,1,1835,1720,1939,1830,WN,1780,N93,124,130,116,69,75,BWI,STL,737,3,5,0,,0 +1996,6,12,3,920,920,1045,1033,TW,425,N990Z,145,133,128,12,0,IAD,STL,696,2,15,0,,0 +1996,6,29,6,1132,1135,1306,1313,NW,597,N956N,94,98,68,-7,-3,MSP,STL,449,7,19,0,,0 +1996,6,24,1,1316,1210,1915,1807,TW,204,N912TW,239,237,201,68,66,SFO,STL,1736,4,34,0,,0 +1996,6,24,1,2319,2035,128,2252,US,2149,N518AU,129,137,113,156,164,BWI,TPA,842,2,14,0,,0 +1996,6,26,3,2025,2024,2146,2131,AA,1933,N893AA,81,67,40,15,1,DFW,TUL,237,2,39,0,,0 +1996,6,7,5,1240,1240,1350,1402,UA,2025,N202UA,70,82,54,-12,0,SFO,LAX,337,6,10,0,,0 +1996,6,12,3,630,630,725,732,DL,1821,N491DA,55,62,42,-7,0,BOS,LGA,185,1,12,0,,0 +1996,6,20,4,1751,1750,2017,2018,DL,492,N911DL,146,148,131,-1,1,MCO,LGA,950,6,9,0,,0 +1996,6,28,5,1309,1310,1435,1420,DL,1262,N2812W,86,70,49,15,-1,DFW,LIT,304,5,32,0,,0 +1996,6,9,7,1200,1200,1325,1315,WN,846,N691,85,75,61,10,0,MDW,MCI,405,18,6,0,,0 +1996,6,5,3,829,830,1045,1045,US,2299,N341US,136,135,120,0,-1,DCA,MCO,759,4,12,0,,0 +1996,6,8,6,800,800,1055,1045,DL,199,N783DL,175,165,148,10,0,SJU,MCO,1189,4,23,0,,0 +1996,6,1,6,950,950,944,950,WN,276,N27,54,60,43,-6,0,SDF,MDW,271,4,7,0,,0 +1996,6,14,5,617,620,753,759,NW,473,N322US,96,99,72,-6,-3,ORD,MEM,491,5,19,0,,0 +1996,6,9,7,921,915,1242,1215,NW,997,N675MC,201,180,176,27,6,DTW,MIA,1145,4,21,0,,0 +1996,6,5,3,2014,2015,2144,2152,NW,950,N765NC,90,97,77,-8,-1,MEM,MKE,556,4,9,0,,0 +1996,6,11,2,1723,1725,1853,1904,NW,839,N916RW,150,159,137,-11,-2,CLT,MSP,930,2,11,0,,0 +1996,6,29,6,659,700,1143,1157,NW,710,N508US,164,177,142,-14,-1,LAS,MSP,1300,6,16,0,,0 +1996,6,20,4,837,840,1325,1334,NW,110,N286US,168,174,149,-9,-3,PHX,MSP,1276,5,14,0,,0 +1996,6,5,3,1245,1245,1344,1345,WN,21,N74,59,60,46,-1,0,HOU,MSY,303,2,11,0,,0 +1996,6,1,6,2115,2100,2215,2205,WN,709,N102,60,65,45,10,15,LAX,OAK,337,2,13,0,,0 +1996,6,4,2,845,845,930,930,WN,474,N60,45,45,31,0,0,DAL,OKC,181,5,9,0,,0 +1996,6,21,5,650,650,807,800,WN,973,N611,77,70,61,7,0,OAK,ONT,361,2,14,0,,0 +1996,6,9,7,2214,1947,14,2115,AA,293,N405AA,120,88,91,179,147,B,ORD,409,9,20,0,,0 +1996,6,30,7,1457,1500,1547,1553,UA,619,N7298U,110,113,88,-6,-3,DCA,ORD,612,8,14,0,,0 +1996,6,18,2,1742,1728,1844,1840,UA,373,N928UA,122,132,110,4,14,HPN,ORD,738,3,9,0,,0 +1996,6,21,5,807,803,937,921,AA,251,N553AA,90,78,61,16,4,MCI,ORD,403,12,17,0,,0 +1996,6,5,3,634,630,1155,1213,UA,686,N575UA,201,223,183,-18,4,PDX,ORD,1739,4,14,0,,0 +1996,6,28,5,632,633,1233,1230,AA,1758,N323AA,241,237,213,3,-1,SFO,ORD,1846,11,17,0,,0 +1996,6,20,4,959,1000,1045,1052,US,868,N237US,46,52,36,-7,-1,PHL,ORF,211,2,8,0,,0 +1996,6,7,5,710,710,837,844,AS,523,N940AS,87,94,77,-7,0,OAK,PDX,543,3,7,0,,0 +1996,6,24,1,2049,1705,2206,1820,US,772,N390US,77,75,62,226,224,CLE,PHL,363,6,9,0,,0 +1996,6,21,5,,715,,1005,US,594,UNKNOW,,110,,,,ORD,PHL,678,0,0,1,,0 +1996,6,10,1,1346,1345,1520,1513,AA,1117,N580AA,154,148,116,7,1,ATL,DFW,732,20,18,0,,0 +1996,6,20,4,1116,1120,1309,1325,AA,1395,N481AA,173,185,152,-16,-4,DCA,DFW,1192,9,12,0,,0 +1996,6,4,2,1229,1233,1553,1615,AA,542,N5CWAA,144,162,124,-22,-4,JAC,DFW,1046,8,12,0,,0 +1996,6,13,4,917,920,1140,1148,NW,409,N90S,143,148,112,-8,-3,MSP,DFW,852,14,17,0,,0 +1996,6,10,1,1443,1445,1940,1931,AA,1820,N5BPAA,177,166,153,9,-2,SAN,DFW,1171,11,13,0,,0 +1996,6,22,6,1506,1510,1552,1554,NW,1435,N930RC,46,44,27,-2,-4,MSP,DLH,144,7,12,0,,0 +1996,6,14,5,1848,1815,2327,2255,UA,504,N305UA,159,160,137,32,33,DEN,DTW,1123,8,14,0,,0 +1996,6,27,4,1102,1105,1256,1310,NW,430,N782NC,54,65,43,-14,-3,MDW,DTW,229,5,6,0,,0 +1996,6,3,1,959,1000,1235,1249,NW,1109,N321US,156,169,133,-14,-1,RSW,DTW,1085,9,14,0,,0 +1996,6,13,4,1412,1355,1428,1415,WN,1225,N304,76,80,67,13,17,SAT,ELP,496,2,7,0,,0 +1996,6,26,3,901,900,1324,1325,CO,274,N17317,203,205,185,-1,1,DFW,EWR,1372,7,11,0,,0 +1996,6,18,2,1707,1644,2026,1948,UA,656,N1828U,139,124,114,38,23,ORD,EWR,719,6,19,0,,0 +1996,6,28,5,2042,2040,2302,2259,DL,1673,N720DA,140,139,116,3,2,CVG,FLL,932,4,20,0,,0 +1996,6,4,2,1706,1705,1806,1810,DL,1504,N331DL,60,65,47,-4,1,ATL,GNV,300,2,11,0,,0 +1996,6,8,6,832,830,1050,1053,UA,191,N1846U,318,323,302,-3,2,LAX,HNL,2556,3,13,0,,0 +1996,6,15,6,2150,2150,2248,2245,WN,1352,N346,58,55,41,3,0,MSY,HOU,303,2,15,0,,0 +1996,6,2,7,1715,1715,1846,1845,NW,1402,N756NW,91,90,60,1,0,DTW,IAD,383,9,22,0,,0 +1996,6,15,6,634,635,740,729,CO,1548,N14628,66,54,39,11,-1,CRP,IAH,201,7,20,0,,0 +1996,6,1,6,1315,1125,1418,1230,CO,1700,N69348,63,65,50,108,110,MFE,IAH,316,5,8,0,,0 +1996,6,12,3,1800,1800,1916,1909,CO,1835,N14839,136,129,107,7,0,TPA,IAH,787,5,24,0,,0 +1996,6,12,3,1845,1830,2212,2009,US,645,N814US,207,99,82,123,15,CLT,ISP,575,3,122,0,,0 +1996,6,4,2,1346,1300,2236,2124,UA,24,N609UA,350,324,328,72,46,LAX,JFK,2475,11,11,0,,0 +1996,6,16,7,2040,2040,2241,2244,US,609,N517AU,301,304,282,-3,0,BWI,LAS,2106,7,12,0,,0 +1996,6,1,6,1445,1445,1555,1600,WN,1288,N692,70,75,60,-5,0,OAK,LAS,407,2,8,0,,0 +1996,6,28,5,850,850,909,908,DL,1098,N526DA,79,78,59,1,0,SLC,LAS,368,6,14,0,,0 +1996,6,13,4,1250,1250,2054,2056,DL,1562,N723DA,304,306,282,-2,0,HNL,LAX,2556,6,16,0,,0 +1996,6,5,3,2014,2015,2132,2134,UA,2221,N904UA,78,79,60,-2,-1,OAK,LAX,337,10,8,0,,0 +1996,6,13,4,1130,1130,1250,1250,WN,1496,N90,80,80,57,0,0,PHX,LAX,370,15,8,0,,0 +1996,6,3,1,928,932,1142,1137,HP,202,N155AW,74,65,48,5,-4,PHX,ABQ,328,11,15,0,,0 +1996,6,29,6,2011,2012,2137,2132,AS,56,N740AS,86,80,75,5,-1,OTZ,ANC,549,4,7,0,,0 +1996,6,29,6,1344,1335,1437,1443,DL,1245,N906DL,53,68,38,-6,9,CLT,ATL,227,8,7,0,,0 +1996,6,19,3,1301,1255,1443,1444,DL,1724,N113DA,102,109,79,-1,6,FLL,ATL,581,6,17,0,,0 +1996,6,24,1,1252,1250,1418,1416,DL,633,N790DL,86,86,67,2,2,MCO,ATL,403,13,6,0,,0 +1996,6,10,1,2109,2105,2302,2309,US,1103,N977VJ,113,124,96,-7,4,PHL,ATL,665,3,14,0,,0 +1996,6,23,7,1359,1355,1554,1600,DL,780,N502DA,115,125,102,-6,4,SYR,ATL,793,4,9,0,,0 +1996,6,21,5,905,905,1126,1114,TW,565,N931L,141,129,95,12,0,STL,AUS,722,4,42,0,,0 +1996,6,28,5,919,925,1006,1010,DL,1682,N332DL,47,45,34,-4,-6,JAN,BHM,211,3,10,0,,0 +1996,6,22,6,1640,1645,1800,1812,AA,572,N2CHAA,80,87,64,-12,-5,ORD,B,409,4,12,0,,0 +1996,6,5,3,1421,1414,1857,1850,AA,1928,N531AA,216,216,198,7,7,DFW,BOS,1562,5,13,0,,0 +1996,6,5,3,833,830,936,944,US,326,N265AU,63,74,46,-8,3,PHL,BOS,280,5,12,0,,0 +1996,6,26,3,2000,2000,2053,2055,WN,289,N513,53,55,39,-2,0,LAS,BUR,223,3,11,0,,0 +1996,6,28,5,1921,1905,2048,2031,DL,1883,N670DN,87,86,67,17,16,CVG,BWI,430,4,16,0,,0 diff --git a/Software/MATLAB/script/Examples/airlinesmall_2.csv b/Software/MATLAB/script/Examples/airlinesmall_2.csv new file mode 100644 index 0000000..99cc1cb --- /dev/null +++ b/Software/MATLAB/script/Examples/airlinesmall_2.csv @@ -0,0 +1,691 @@ +Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay,DepDelay,Origin,Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted +1996,6,15,6,2141,2130,2215,2204,US,100,N528AU,34,34,19,11,11,CLT,CAE,88,4,11,0,,0 +1996,6,1,6,958,1000,1112,1120,CO,1648,N27610,74,80,62,-8,-2,GSO,CLE,381,3,9,0,,0 +1996,6,9,7,932,935,1142,1145,US,994,N481US,70,70,58,-3,-3,BHM,CLT,351,7,5,0,,0 +1996,6,13,4,1645,1643,1735,1735,US,353,N483US,50,52,41,0,2,ILM,CLT,185,3,6,0,,0 +1996,6,10,1,652,635,804,740,US,755,N887US,72,65,60,24,17,RIC,CLT,256,3,9,0,,0 +1996,6,26,3,1950,1950,2215,2228,NW,877,N93S,85,98,72,-13,0,MEM,CMH,518,6,7,0,,0 +1996,6,19,3,1647,1650,1741,1747,DL,1179,N902DL,54,57,39,-6,-3,CLE,CVG,221,5,10,0,,0 +1996,6,22,6,1449,1450,2110,2119,DL,1038,N918DE,201,209,187,-9,-1,PHX,CVG,1569,3,11,0,,0 +1996,6,16,7,1730,1730,1820,1825,WN,48,N62,50,55,41,-5,0,HOU,DAL,239,4,5,0,,0 +1996,6,2,7,1454,1440,1611,1559,US,1615,N270AU,77,79,61,12,14,BDL,DCA,313,5,11,0,,0 +1996,6,24,1,621,625,737,750,US,2299,N354US,76,85,60,-13,-4,MHT,DCA,407,7,9,0,,0 +1996,6,30,7,709,700,746,739,UA,305,N1825U,37,39,20,7,9,COS,DEN,72,4,13,0,,0 +1996,6,3,1,1340,1340,1548,1549,UA,1221,N586UA,248,249,224,-1,0,MIA,DEN,1709,4,20,0,,0 +1996,6,4,2,2018,2020,2133,2143,DL,870,N136DL,75,83,50,-10,-2,SLC,DEN,391,5,20,0,,0 +1996,7,19,5,1012,1015,1115,1117,HP,98,N164AW,63,62,44,-2,-3,LAS,PHX,256,5,14,0,,0 +1996,7,30,2,1330,1330,1433,1435,WN,628,N696,63,65,52,-2,0,ONT,PHX,325,4,7,0,,0 +1996,7,19,5,2020,2020,2126,2126,HP,92,N168AW,66,66,52,0,0,S,PHX,338,5,9,0,,0 +1996,7,30,2,1219,1215,1257,1302,US,644,N899US,38,47,30,-5,4,CRW,PIT,164,4,4,0,,0 +1996,7,9,2,1039,1040,1247,1300,US,367,N981US,68,80,54,-13,-1,MKE,PIT,431,6,8,0,,0 +1996,7,31,3,928,930,1002,1007,DL,2043,N312DL,34,37,23,-5,-2,GEG,PSC,120,2,9,0,,0 +1996,7,1,1,,2105,,2219,US,1734,UNKNOW,,74,,,,PHL,RDU,336,0,0,1,,0 +1996,7,16,2,2147,2150,2236,2245,US,1898,N265AU,49,55,34,-9,-3,PIT,ROA,219,5,10,0,,0 +1996,7,5,5,946,945,1031,1048,CO,471,N92874,165,183,152,-17,1,IAH,SAN,1303,4,9,0,,0 +1996,7,3,3,1241,1145,1357,1305,WN,489,N314,76,80,66,52,56,SMF,SAN,480,2,8,0,,0 +1996,7,20,6,1340,1329,1436,1430,DL,1204,N658DL,56,61,35,6,11,ATL,SAV,215,5,16,0,,0 +1996,7,28,7,2050,2037,2302,2247,AS,547,N936AS,132,130,115,15,13,BUR,SEA,937,7,10,0,,0 +1996,7,11,4,2330,2235,111,14,AS,479,N773AS,101,99,83,57,55,OAK,SEA,671,5,13,0,,0 +1996,7,12,5,903,859,1052,1050,DL,217,N123DN,289,291,272,2,4,ATL,SFO,2139,6,11,0,,0 +1996,7,11,4,808,800,1116,1102,UA,809,N646UA,368,362,336,14,8,JFK,SFO,2586,10,22,0,,0 +1996,7,2,2,1337,1340,1518,1520,UA,2114,N316UA,101,100,87,-2,-3,PDX,SFO,550,3,11,0,,0 +1996,7,23,2,2129,2135,2217,2225,DL,1444,N986DL,48,50,35,-8,-6,JAN,SHV,220,5,8,0,,0 +1996,7,28,7,1134,1125,1214,1214,DL,944,N302WA,100,109,86,0,9,SLC,SJC,585,4,10,0,,0 +1996,7,17,3,1243,1235,1418,1408,AA,841,N2CFAA,155,153,139,10,8,DFW,SLC,988,3,13,0,,0 +1996,7,28,7,659,655,925,916,DL,915,N303WA,86,81,70,9,4,PSC,SLC,521,7,9,0,,0 +1996,7,1,1,2015,2015,2138,2140,WN,757,N608,83,85,65,-2,0,SAN,SMF,480,4,14,0,,0 +1996,7,17,3,1858,1900,2021,2020,HP,775,N169AW,83,80,70,1,-2,SMF,S,404,5,8,0,,0 +1996,7,9,2,1848,1848,2144,2150,TW,566,EI-CIW,116,122,89,-6,0,DEN,STL,770,9,18,0,,0 +1996,7,10,3,559,600,700,706,TW,250,N410EA,61,66,50,-6,-1,LIT,STL,296,5,6,0,,0 +1996,7,30,2,1000,945,1117,1057,TW,435,N64320,77,72,58,20,15,ORD,STL,258,8,11,0,,0 +1996,7,29,1,1825,1825,1904,1851,TW,589,N973Z,99,86,73,13,0,TYS,STL,405,21,5,0,,0 +1996,7,10,3,1625,1625,1714,1714,DL,807,N616DL,49,49,33,0,0,FLL,TPA,197,5,11,0,,0 +1996,7,12,5,2007,1955,2110,2042,UA,589,N976UA,123,107,96,28,12,DEN,TUS,639,4,23,0,,0 +1996,7,30,2,2202,2155,2314,2246,DL,471,N118DL,132,111,88,28,7,SLC,LAX,590,12,32,0,,0 +1996,7,28,7,1648,1640,1829,1823,US,2412,N815US,101,103,78,6,8,CLT,LGA,544,5,18,0,,0 +1996,7,4,4,1555,1600,1850,1906,AA,358,N402AA,115,126,98,-16,-5,ORD,LGA,733,5,12,0,,0 +1996,7,25,4,1805,1805,1854,1900,WN,784,N90,49,55,42,-6,0,AUS,MAF,294,2,5,0,,0 +1996,7,25,4,1557,1555,1708,1716,UA,761,N9022U,71,81,58,-8,2,ORD,MCI,403,4,9,0,,0 +1996,7,5,5,848,850,1122,1135,CO,300,N937MC,154,165,131,-13,-2,EWR,MCO,938,4,19,0,,0 +1996,7,6,6,2058,2100,2208,2216,NW,696,N93S,70,76,54,-8,-2,DTW,MDT,370,6,10,0,,0 +1996,7,18,4,2300,2235,2350,2325,WN,946,N83,50,50,40,25,25,STL,MDW,251,5,5,0,,0 +1996,7,9,2,1300,1300,1845,1904,NW,988,N512US,225,244,206,-19,0,SEA,MEM,1870,4,15,0,,0 +1996,7,13,6,830,830,1210,1127,CO,579,N579PE,220,177,168,43,0,EWR,MIA,1086,7,45,0,,0 +1996,7,3,3,1901,1830,2004,1942,NW,376,N529US,63,72,45,22,31,MSP,MKE,297,4,14,0,,0 +1996,7,22,1,844,845,1025,1023,NW,837,N925US,161,158,136,2,-1,CLT,MSP,930,4,21,0,,0 +1996,7,30,2,1659,1700,1834,1848,NW,397,N302RC,95,108,79,-14,-1,IND,MSP,503,6,10,0,,0 +1996,7,18,4,1727,1725,2043,1915,NW,711,N521US,256,170,169,88,2,PHL,MSP,980,6,81,0,,0 +1996,7,16,2,1736,1712,1916,1837,AA,2016,N717AA,100,85,78,39,24,DFW,MSY,448,3,19,0,,0 +1996,7,3,3,653,650,801,758,UA,2200,N304UA,68,68,51,3,3,LAX,OAK,337,4,13,0,,0 +1996,7,19,5,1853,1855,1927,1934,AA,161,N133AA,34,39,21,-7,-2,HNL,OGG,100,4,9,0,,0 +1996,7,8,1,1533,1535,1609,1628,DL,1470,N492DA,156,173,138,-19,-2,DFW,ONT,1189,3,15,0,,0 +1996,7,17,3,1836,1555,2025,1644,UA,1459,N7264U,169,109,143,221,161,ATL,ORD,606,5,21,0,,0 +1996,7,5,5,2024,2020,2027,2035,DL,2093,N903DE,63,75,39,-8,4,CVG,ORD,264,6,18,0,,0 +1996,7,23,2,656,700,819,818,CO,509,N12327,143,138,109,1,-4,EWR,ORD,719,7,27,0,,0 +1996,7,17,3,634,630,745,734,AA,303,N624AA,131,124,113,11,4,LGA,ORD,733,6,12,0,,0 +1996,7,1,1,1458,1500,1643,1618,UA,536,N9007U,105,78,53,25,-2,MSP,ORD,334,39,13,0,,0 +1996,7,7,7,1715,1715,1749,1757,UA,453,N9039U,94,102,83,-8,0,ROC,ORD,528,4,7,0,,0 +1996,7,11,4,1057,1056,1138,1145,UA,1473,N9001U,101,109,91,-7,1,SYR,ORD,607,3,7,0,,0 +1996,7,25,4,2123,2030,2258,2153,DL,1297,N652DL,275,263,260,65,53,CVG,PDX,1975,4,11,0,,0 +1996,7,11,4,1005,1005,1042,1050,WN,1052,N396,97,105,88,-8,0,SLC,PDX,630,3,6,0,,0 +1996,7,15,1,816,815,1239,1229,CO,1790,N17619,203,194,163,10,1,IAH,PHL,1324,5,35,0,,0 +1996,7,3,3,1844,1845,2203,2207,TW,108,N9404V,139,142,110,-4,-1,STL,PHL,813,4,25,0,,0 +1996,7,15,1,1429,1428,1635,1626,AA,1323,N2BA,126,118,102,9,1,B,DFW,631,12,12,0,,0 +1996,7,23,2,1717,1626,1956,1909,AA,1314,N2BEAA,99,103,78,47,51,ELP,DFW,551,11,10,0,,0 +1996,7,24,3,1455,1500,1731,1741,AA,25,N242AA,216,221,190,-10,-5,LGA,DFW,1389,6,20,0,,0 +1996,7,16,2,2040,2000,2253,2216,AA,2257,N410AA,133,136,105,37,40,ORD,DFW,802,11,17,0,,0 +1996,7,29,1,1339,1341,1943,1927,AA,963,N432AA,244,226,176,16,-2,SFO,DFW,1464,32,36,0,,0 +1996,7,6,6,1603,1605,1741,1745,NW,1521,N772NC,98,100,75,-4,-2,ALB,DTW,488,5,18,0,,0 +1996,7,1,1,1256,1300,1615,1600,NW,243,N754NW,199,180,154,15,-4,FLL,DTW,1127,33,12,0,,0 +1996,7,31,3,1826,1830,2131,2133,NW,608,N346NW,185,183,153,-2,-4,MIA,DTW,1145,14,18,0,,0 +1996,7,15,1,1013,1015,1733,1738,NW,344,N511US,260,263,235,-5,-2,SFO,DTW,2079,13,12,0,,0 +1996,7,8,1,1632,1500,1842,1718,CO,382,N13234,130,138,102,84,92,ATL,EWR,745,6,22,0,,0 +1996,7,31,3,1207,1205,1341,1343,NW,30,N610NW,94,98,75,-2,2,DTW,EWR,487,7,12,0,,0 +1996,7,23,2,1347,1315,1720,1603,CO,444,N14810,213,168,135,77,32,PBI,EWR,1024,14,64,0,,0 +1996,7,25,4,2045,2040,2302,2259,DL,1673,N495DA,137,139,124,3,5,CVG,FLL,932,2,11,0,,0 +1996,7,3,3,817,819,923,920,DL,1255,N382DL,66,61,50,3,-2,ATL,GNV,300,2,14,0,,0 +1996,7,7,7,1540,1545,1755,1815,NW,933,N151US,315,330,297,-20,-5,LAX,HNL,2556,4,14,0,,0 +1996,7,5,5,630,630,726,730,WN,708,N302,56,60,47,-4,0,MSY,HOU,303,2,7,0,,0 +1996,7,3,3,611,610,1109,1111,UA,1755,N7280U,178,181,161,-2,1,DEN,IAD,1452,6,11,0,,0 +1996,7,21,7,1154,1150,1339,1333,CO,1993,N15820,165,163,143,6,4,CLE,IAH,1091,5,17,0,,0 +1996,7,23,2,1052,1055,1321,1322,CO,619,N16806,209,207,188,-1,-3,LGA,IAH,1416,5,16,0,,0 +1996,7,12,5,1704,1700,2236,2244,CO,240,N16895,212,224,193,-8,4,SFO,IAH,1635,8,11,0,,0 +1996,7,9,2,751,744,843,836,UA,418,N7451U,52,52,38,7,7,ORD,IND,177,6,8,0,,0 +1996,7,13,6,1720,1610,1917,1754,TW,224,N9405T,117,104,86,83,70,DTW,JFK,508,10,21,0,,0 +1996,7,17,3,1115,1054,1156,1148,AS,63,N782AS,101,114,86,8,21,SEA,KTN,680,5,10,0,,0 +1996,7,10,3,1620,1616,1724,1714,UA,2162,N309UA,64,58,47,10,4,LAX,LAS,236,3,14,0,,0 +1996,7,21,7,645,645,746,749,HP,2085,N636AW,61,64,46,-3,0,SAN,LAS,258,3,12,0,,0 +1996,7,10,3,1012,1000,1128,1137,UA,1055,N392UA,136,157,118,-9,12,DEN,LAX,862,8,10,0,,0 +1996,7,13,6,1932,1930,2049,2037,HP,2045,N127AW,77,67,46,12,2,LAS,LAX,236,8,23,0,,0 +1996,7,2,2,2015,2015,2211,2227,UA,131,N416UA,236,252,213,-16,0,ORD,LAX,1745,7,16,0,,0 +1996,7,13,6,1251,1255,1323,1320,DL,1092,N369DL,32,25,20,3,-4,AVP,ABE,50,4,8,0,,0 +1996,7,25,4,2352,2300,34,2342,DL,2004,N920DL,42,42,28,52,52,ATL,AGS,143,3,11,0,,0 +1996,7,20,6,756,730,1255,1224,DL,1100,N934DL,179,174,161,31,26,ABQ,ATL,1269,4,14,0,,0 +1996,7,3,3,600,600,711,718,DL,889,N905DE,71,78,58,-7,0,DAY,ATL,432,5,8,0,,0 +1996,7,5,5,546,550,736,737,DL,506,N921DL,50,47,28,-1,-4,HSV,ATL,151,11,11,0,,0 +1996,7,6,6,701,700,906,858,AA,1503,N719AA,125,118,86,8,1,MIA,ATL,595,20,19,0,,0 +1996,7,31,3,2025,2000,2208,2133,US,1541,N946VJ,103,93,83,35,25,PIT,ATL,526,7,13,0,,0 +1996,7,3,3,1335,1325,1620,1619,DL,1917,N535DA,105,114,74,1,10,TUL,ATL,674,5,26,0,,0 +1996,7,27,6,1213,1215,1251,1303,NW,1795,N8907E,38,48,25,-12,-2,DTW,AZO,113,5,8,0,,0 +1996,7,8,1,1356,1345,1541,1526,UA,283,N9072U,105,101,81,15,11,ORD,BHM,584,3,21,0,,0 +1996,7,7,7,1155,1155,1225,1227,US,1256,N887US,90,92,74,-2,0,PIT,B,462,6,10,0,,0 +1996,7,25,4,1037,1040,1216,1229,NW,384,N318US,99,109,76,-13,-3,DTW,BOS,632,8,15,0,,0 +1996,7,10,3,1500,1500,1558,1610,US,1731,N928VJ,58,70,48,-12,0,PHL,BOS,280,4,6,0,,0 +1996,7,18,4,640,640,732,735,WN,568,N366,52,55,41,-3,0,LAS,BUR,223,2,9,0,,0 +1996,7,28,7,1551,1510,1707,1633,DL,282,N525DA,76,83,66,34,41,CVG,BWI,430,3,7,0,,0 +1996,7,17,3,2115,1950,2202,2045,DL,1796,N906DE,47,55,32,77,85,ATL,CAE,191,6,9,0,,0 +1996,7,29,1,1304,1300,1424,1432,CO,409,N70330,80,92,61,-8,4,EWR,CLE,404,4,15,0,,0 +1996,7,27,6,1016,1015,1124,1126,US,1682,N899US,68,71,42,-2,1,ATL,CLT,227,9,17,0,,0 +1996,7,18,4,1842,1844,1932,1920,US,615,N562AU,50,36,27,12,-2,GSP,CLT,75,18,5,0,,0 +1996,7,21,7,1443,1430,1615,1550,US,765,N802US,92,80,65,25,13,PIT,CLT,366,9,18,0,,0 +1996,7,15,1,1946,1850,2131,2035,HP,2990,N621AW,105,105,79,56,56,EWR,CMH,462,6,20,0,,0 +1996,7,17,3,1320,1320,1509,1508,DL,697,N506DA,109,108,95,1,0,ALB,CVG,623,4,10,0,,0 +1996,7,4,4,1441,1440,1718,1722,NW,1426,N3312L,97,102,81,-4,1,MSP,CVG,596,6,10,0,,0 +1996,7,16,2,1805,1805,1856,1855,WN,136,N512,51,50,33,1,0,AUS,DAL,189,3,15,0,,0 +1996,7,2,2,1427,1426,1755,1752,AA,1636,N2BGAA,148,146,115,3,1,DFW,DAY,861,8,25,0,,0 +1996,7,18,4,818,820,1221,1219,CO,532,N16892,183,179,158,2,-2,IAH,DCA,1208,2,23,0,,0 +1996,7,30,2,626,625,736,732,UA,1762,N7272U,70,67,54,4,1,ABQ,DEN,349,6,10,0,,0 +1996,7,26,5,1639,1640,1656,1701,UA,395,N399UA,77,81,64,-5,-1,ICT,DEN,419,4,9,0,,0 +1996,7,28,7,1825,1720,2105,2005,HP,2491,N328AW,100,105,79,60,65,PHX,DEN,602,11,10,0,,0 +1996,8,14,3,1137,1135,1215,1220,UA,419,N551UA,98,105,82,-5,2,DEN,PHX,602,3,13,0,,0 +1996,8,5,1,700,700,808,810,WN,603,N603,68,70,55,-2,0,LAX,PHX,370,4,9,0,,0 +1996,8,5,1,815,815,910,915,WN,1106,N385,55,60,48,-5,0,SAN,PHX,304,2,5,0,,0 +1996,8,5,1,912,915,1101,1052,US,388,N856US,109,97,82,9,-3,ATL,PIT,526,3,24,0,,0 +1996,8,11,7,1233,1230,1459,1504,US,417,N824US,146,154,130,-5,3,FLL,PIT,994,6,10,0,,0 +1996,8,27,2,1750,1740,1854,1852,US,478,N255AU,64,72,51,2,10,RIC,PIT,259,6,7,0,,0 +1996,8,27,2,1210,1205,1318,1319,CO,1982,N14381,68,74,46,-1,5,EWR,PWM,284,4,18,0,,0 +1996,8,29,4,839,755,920,835,DL,806,N296WA,41,40,25,45,44,RDU,RIC,139,5,11,0,,0 +1996,8,28,3,1135,1139,1229,1242,AA,893,N2CUAA,54,63,42,-13,-4,ORD,RST,268,3,9,0,,0 +1996,8,15,4,1520,1520,1726,1733,UA,731,N330UA,246,253,224,-7,0,ORD,SAN,1723,3,19,0,,0 +1996,8,7,3,1056,1059,1201,1159,AA,739,N279AA,65,60,43,2,-3,DFW,SAT,247,3,19,0,,0 +1996,8,8,4,1945,1905,2020,1944,DL,1080,N906DE,35,39,20,36,40,CVG,SDF,83,7,8,0,,0 +1996,8,13,2,1750,1730,1842,1821,AS,594,N977AS,52,51,41,21,20,GEG,SEA,224,3,8,0,,0 +1996,8,15,4,1748,1740,2205,1946,US,115,N617AU,437,306,276,139,8,PIT,SEA,2125,5,156,0,,0 +1996,8,21,3,2030,2000,2158,2125,UA,509,N528UA,148,145,123,33,30,DEN,SFO,967,9,16,0,,0 +1996,8,1,4,1433,1432,1541,1549,UA,2046,N377UA,68,77,50,-8,1,LAX,SFO,337,7,11,0,,0 +1996,8,22,4,1052,1033,1153,1128,UA,2396,N366UA,61,55,50,25,19,RNO,SFO,192,2,9,0,,0 +1996,8,24,6,1017,1015,1138,1146,DL,1573,N915DE,201,211,181,-8,2,DFW,SJC,1438,5,15,0,,0 +1996,8,9,5,827,815,1256,1203,AA,1137,N084AA,269,228,209,53,12,JFK,SJU,1597,7,53,0,,0 +1996,8,9,5,1908,1850,2124,2103,DL,1939,N308WA,76,73,56,21,18,LAS,SLC,368,6,14,0,,0 +1996,8,20,2,639,640,859,905,DL,736,N420DA,80,85,65,-6,-1,SMF,SLC,532,4,11,0,,0 +1996,8,21,3,1734,1735,1906,1905,DL,1445,N656DL,272,270,233,1,-1,ATL,S,1919,7,32,0,,0 +1996,8,1,4,1738,1739,1821,1830,DL,773,N919DL,103,111,71,-9,-1,ATL,STL,483,5,27,0,,0 +1996,8,26,1,1854,1855,1932,1936,NW,1447,N759NW,98,101,77,-4,-1,DTW,STL,440,10,11,0,,0 +1996,8,15,4,1501,1435,1600,1530,WN,1078,N528,59,55,43,30,26,MCI,STL,237,3,13,0,,0 +1996,8,27,2,1642,1645,2143,2142,TW,391,N9305N,181,177,152,1,-3,PHX,STL,1262,19,10,0,,0 +1996,8,22,4,1520,1515,1657,1650,DL,335,N328DL,97,95,75,7,5,CVG,SYR,527,4,18,0,,0 +1996,8,2,5,701,700,945,944,DL,315,N967DL,164,164,143,1,1,LGA,TPA,1011,3,18,0,,0 +1996,8,21,3,2147,2150,2305,2312,AA,1711,N433AA,198,202,180,-7,-3,ORD,TUS,1437,5,13,0,,0 +1996,8,25,7,1806,1805,2006,1951,DL,807,N633DL,300,286,278,15,1,TPA,LAX,2158,7,15,0,,0 +1996,8,13,2,1034,1031,1607,1600,UA,404,N553UA,213,209,192,7,3,DEN,LGA,1619,4,17,0,,0 +1996,8,15,4,1300,1300,1602,1555,UA,896,N415UA,122,115,98,7,0,ORD,LGA,733,3,21,0,,0 +1996,8,15,4,,2116,,2312,UA,464,UNKNOW,,56,,,,ORD,MBS,222,0,0,1,,0 +1996,8,17,6,938,900,1056,1012,TW,111,N927L,78,72,44,44,38,STL,MCI,237,3,31,0,,0 +1996,8,21,3,741,745,942,950,US,1689,N351US,121,125,101,-8,-4,IAD,MCO,758,4,16,0,,0 +1996,8,2,5,1830,1830,1943,1945,WN,1857,N721,73,75,61,-2,0,B,MDW,395,3,9,0,,0 +1996,8,23,5,1109,1115,1245,1252,NW,779,N942N,96,97,81,-7,-6,AUS,MEM,559,4,11,0,,0 +1996,8,10,6,1545,1546,1742,1717,AA,1897,N2BPAA,117,91,94,25,-1,DFW,MFE,468,4,19,0,,0 +1996,8,11,7,1229,1230,1514,1529,AA,1819,N052AA,165,179,141,-15,-1,JFK,MIA,1090,3,21,0,,0 +1996,8,7,3,1559,1600,1716,1712,TW,526,N996Z,77,72,49,4,-1,STL,MKE,317,5,23,0,,0 +1996,8,2,5,,740,,830,NW,409,N612NW,,110,,,,DAY,MSP,574,0,0,1,,0 +1996,8,28,3,1900,1905,2100,2100,NW,371,N330NW,180,175,149,0,-5,LGA,MSP,1020,9,22,0,,0 +1996,8,8,4,1445,1440,1718,1701,NW,1256,N942N,93,81,75,17,5,RAP,MSP,490,6,12,0,,0 +1996,8,24,6,1712,1700,1806,1800,WN,361,N524,54,60,45,6,12,HOU,MSY,303,2,7,0,,0 +1996,8,18,7,1943,1930,2049,2040,WN,865,N686,66,70,57,9,13,LAX,OAK,337,4,5,0,,0 +1996,8,7,3,1320,1320,1401,1405,WN,138,N702,41,45,31,-4,0,DAL,OKC,181,4,6,0,,0 +1996,8,31,6,1215,1215,1301,1305,WN,1841,N627,46,50,31,-4,0,LAS,ONT,197,2,13,0,,0 +1996,8,21,3,1639,1640,1921,1915,AA,2085,N2DEAA,162,155,146,6,-1,AUS,ORD,978,7,9,0,,0 +1996,8,2,5,831,800,825,807,UA,465,N9063U,54,67,40,18,31,DAY,ORD,240,7,7,0,,0 +1996,8,24,6,1039,1030,1155,1136,UA,645,N1843U,136,126,105,19,9,EWR,ORD,719,9,22,0,,0 +1996,8,2,5,1102,1100,1222,1210,AA,321,N550AA,140,130,109,12,2,LGA,ORD,733,11,20,0,,0 +1996,8,13,2,2007,2000,2121,2123,UA,1160,N978UA,74,83,53,-2,7,MSP,ORD,334,4,17,0,,0 +1996,8,13,2,1112,1117,1211,1219,AA,844,N2BMAA,59,62,43,-8,-5,RST,ORD,268,7,9,0,,0 +1996,8,19,1,1000,1000,1133,1133,UA,497,N559UA,153,153,130,0,0,TPA,ORD,1012,10,13,0,,0 +1996,8,1,4,2006,2005,2141,2133,UA,725,N506UA,155,148,137,8,1,DEN,PDX,992,3,15,0,,0 +1996,8,7,3,1405,1405,1520,1530,WN,1555,N606,75,85,67,-10,0,SMF,PDX,479,2,6,0,,0 +1996,8,20,2,1727,1725,1827,1825,UA,1108,N982UA,60,60,42,2,2,IAD,PHL,134,4,14,0,,0 +1996,8,3,6,1416,1415,1630,1645,US,821,N280AU,134,150,122,-15,1,SRQ,PHL,956,5,7,0,,0 +1996,8,21,3,652,655,847,845,AA,1215,N450AA,115,110,93,2,-3,BHM,DFW,597,8,14,0,,0 +1996,8,12,1,1947,1905,2109,2049,NW,1417,N505US,142,164,127,20,42,DTW,DFW,987,5,10,0,,0 +1996,8,13,2,1913,1915,5,13,AA,1804,N549AA,172,178,137,-8,-2,LAX,DFW,1235,8,27,0,,0 +1996,8,19,1,858,900,1116,1114,AA,2213,N278AA,138,134,105,2,-2,ORD,DFW,802,13,20,0,,0 +1996,8,28,3,723,726,1312,1319,AA,432,N463AA,229,233,194,-7,-3,SEA,DFW,1660,16,19,0,,0 +1996,8,8,4,2231,2210,2329,2317,UA,571,N316UA,58,67,43,12,21,ORD,DSM,299,5,10,0,,0 +1996,8,10,6,1648,1650,1925,1926,NW,497,N8903E,97,96,81,-1,-2,DSM,DTW,534,7,9,0,,0 +1996,8,9,5,1410,1410,1609,1610,WN,901,N691,59,60,41,-1,0,MDW,DTW,229,5,13,0,,0 +1996,8,20,2,621,625,859,815,NW,1438,N3310L,98,50,67,44,-4,SBN,DTW,157,5,26,0,,0 +1996,8,17,6,1813,1730,1851,1808,US,850,N927VJ,38,38,24,43,43,PIT,ERI,109,6,8,0,,0 +1996,8,31,6,1754,1540,2338,2005,AA,1008,N878AA,284,205,180,213,134,DFW,EWR,1372,25,79,0,,0 +1996,8,4,7,1020,1020,1329,1325,CO,356,N16232,129,125,98,4,0,ORD,EWR,719,6,25,0,,0 +1996,8,5,1,1124,1120,1330,1306,NW,1802,N986US,186,166,157,24,4,MSP,FCA,1026,4,25,0,,0 +1996,8,27,2,1336,1259,1434,1349,AS,305,N941AS,58,50,39,45,37,SEA,GEG,224,2,17,0,,0 +1996,8,26,1,1613,1610,1756,1808,US,248,N526AU,103,118,87,-12,3,LGA,GSP,610,3,13,0,,0 +1996,8,11,7,2205,2205,2252,2255,WN,713,N504,47,50,39,-3,0,HRL,HOU,276,3,5,0,,0 +1996,8,31,6,1510,1510,1614,1625,UA,1195,N953UA,64,75,49,-11,0,BDL,IAD,326,7,8,0,,0 +1996,8,1,4,1839,1840,1927,1925,CO,1711,N13891,48,45,33,2,-1,AUS,IAH,140,4,11,0,,0 +1996,8,4,7,943,945,1432,1442,CO,1936,N35832,169,177,147,-10,-2,LAS,IAH,1222,5,17,0,,0 +1996,8,18,7,1512,1515,1639,1642,CO,1757,N14325,87,87,71,-3,-3,PNS,IAH,489,5,11,0,,0 +1996,8,29,4,1309,1310,1522,1523,CO,1682,N27610,133,133,110,-1,-1,IAH,IND,845,7,16,0,,0 +1996,8,19,1,1016,1015,1327,1324,TW,494,N408EA,131,129,98,3,1,STL,JAX,753,4,29,0,,0 +1996,8,30,5,1725,1645,2050,2015,TW,66,N651TW,145,150,126,35,40,STL,JFK,892,8,11,0,,0 +1996,8,13,2,39,2355,233,201,DL,415,N665DN,294,306,278,32,44,JFK,LAS,2248,4,12,0,,0 +1996,8,10,6,615,615,710,710,WN,117,N300,55,55,46,0,0,PHX,LAS,256,2,7,0,,0 +1996,8,9,5,1942,1935,2115,2120,DL,1085,N138DL,273,285,242,-5,7,ATL,LAX,1946,9,22,0,,0 +1996,8,26,1,1800,1800,2102,2048,AA,21,N129AA,362,348,312,14,0,JFK,LAX,2475,8,42,0,,0 +1996,8,20,2,1435,1430,1540,1545,WN,1487,N664,65,75,54,-5,5,OAK,LAX,337,5,6,0,,0 +1996,8,6,2,904,904,1124,1133,AS,256,N953AS,140,149,126,-9,0,SEA,LAX,954,3,11,0,,0 +1996,8,26,1,1443,1443,1646,1649,HP,2205,N166AW,63,66,48,-3,0,PHX,ABQ,328,4,11,0,,0 +1996,8,26,1,2019,2005,2332,2324,UA,1833,N591UA,373,379,360,8,14,ORD,ANC,2846,4,9,0,,0 +1996,8,19,1,916,915,1103,1055,DL,1107,N908DE,107,100,86,8,1,CLE,ATL,554,7,14,0,,0 +1996,8,1,4,1350,1335,1610,1543,DL,775,N908DE,140,128,109,27,15,EWR,ATL,745,10,21,0,,0 +1996,8,13,2,1320,1320,1543,1550,DL,1598,N917DE,83,90,64,-7,0,LIT,ATL,453,9,10,0,,0 +1996,8,19,1,908,907,1055,1045,DL,705,N790DL,107,98,90,10,1,PBI,ATL,545,4,13,0,,0 +1996,8,9,5,1435,1440,1608,1608,DL,1126,N913DE,93,88,80,0,-5,SRQ,ATL,445,3,10,0,,0 +1996,8,2,5,1408,1410,1546,1551,NW,1032,N919RW,98,101,79,-5,-2,MEM,AUS,559,4,15,0,,0 +1996,8,19,1,2221,2110,2300,2144,DL,224,N290WA,39,34,26,76,71,PWM,BGR,109,6,7,0,,0 +1996,8,11,7,1310,1310,1447,1455,WN,1263,N61,97,105,85,-8,0,HOU,B,670,2,10,0,,0 +1996,8,27,2,1501,1505,1657,1659,HP,2828,N185AW,116,114,96,-2,-4,CMH,BOS,640,7,13,0,,0 +1996,8,1,4,1630,1620,2022,1928,DL,958,N990DL,232,188,207,54,10,MIA,BOS,1258,9,16,0,,0 +1996,8,10,6,956,940,1138,1118,US,1212,N823US,102,98,75,20,16,CLT,BUF,546,4,23,0,,0 +1996,8,15,4,1932,1910,2107,2047,DL,390,N910DE,95,97,77,20,22,ATL,BWI,576,4,14,0,,0 +1996,8,28,3,657,700,744,753,US,1177,N245US,47,53,35,-9,-3,ORF,BWI,159,4,8,0,,0 +1996,8,29,4,633,635,831,824,CO,155,N17321,118,109,100,7,-2,BOS,CLE,563,4,14,0,,0 +1996,8,17,6,2045,2020,2245,2229,UA,808,N1831U,60,69,42,16,25,ORD,CLE,316,4,14,0,,0 +1996,8,9,5,857,900,1011,1015,US,1758,N802US,74,75,57,-4,-3,DAY,CLT,370,3,14,0,,0 +1996,8,1,4,1237,1220,1434,1418,US,538,N608AU,117,118,98,16,17,MIA,CLT,650,6,13,0,,0 +1996,8,7,3,1243,1240,1428,1412,US,59,N632AU,105,92,88,16,3,TPA,CLT,508,7,10,0,,0 +1996,8,13,2,1229,1230,1307,1304,UA,1043,N519UA,38,34,18,3,-1,DEN,COS,72,7,13,0,,0 +1996,8,6,2,1351,1330,1527,1518,DL,1415,N519DA,96,108,70,9,21,EWR,CVG,569,10,16,0,,0 +1996,8,4,7,1544,1545,1729,1738,DL,1202,N330DL,45,53,34,-9,-1,SBN,CVG,203,4,7,0,,0 +1996,8,2,5,2100,2100,2152,2155,WN,1025,N360,52,55,42,-3,0,LBB,DAL,293,2,8,0,,0 +1996,8,28,3,753,755,911,914,US,1178,N340US,78,79,62,-3,-2,CHS,DCA,444,7,9,0,,0 +1996,8,17,6,1819,1820,2131,2142,NW,1767,N518US,132,142,112,-11,-1,MSP,DCA,931,4,16,0,,0 +1996,8,23,5,917,915,1012,953,DL,1585,N534DA,175,158,142,19,2,CVG,DEN,1069,5,28,0,,0 +1996,8,30,5,1425,1425,1620,1634,UA,1607,N580UA,235,249,218,-14,0,MIA,DEN,1709,5,12,0,,0 +1996,8,25,7,1604,1605,1925,1927,UA,1058,N373UA,141,142,127,-2,-1,SJC,DEN,948,5,9,0,,0 +1996,9,11,3,730,730,735,740,WN,760,N300,65,70,53,-5,0,ELP,PHX,347,4,8,0,,0 +1996,9,13,5,2035,2020,2202,2131,NW,107,N321US,207,191,186,31,15,MSP,PHX,1276,4,17,0,,0 +1996,9,1,7,2003,2005,2033,2038,DL,469,N644DL,90,93,71,-5,-2,SLC,PHX,507,4,15,0,,0 +1996,9,15,7,748,750,827,833,US,317,N423US,39,43,22,-6,-2,CLE,PIT,105,8,9,0,,0 +1996,9,12,4,1033,1035,1343,1332,US,700,N531AU,130,117,115,11,-2,MCI,PIT,773,6,9,0,,0 +1996,9,29,7,1928,1823,2158,2044,US,1216,N446US,150,141,111,74,65,TPA,PIT,873,6,33,0,,0 +1996,9,16,1,717,720,856,855,US,1057,N972VJ,99,95,69,1,-3,LGA,RDU,431,4,26,0,,0 +1996,9,27,5,1828,1820,1843,1841,DL,1624,N469DA,75,81,55,2,8,SLC,RNO,422,6,14,0,,0 +1996,9,11,3,927,930,1115,1112,NW,285,N302US,288,282,260,3,-3,DTW,SAN,1957,2,26,0,,0 +1996,9,24,2,1819,1810,1905,1858,DL,1895,N3301,106,108,89,7,9,SLC,SAN,626,2,15,0,,0 +1996,9,12,4,1730,1720,1840,1821,DL,1471,N538DA,70,61,39,19,10,ATL,SAV,215,6,25,0,,0 +1996,9,29,7,1551,1500,1719,1629,UA,1420,N7266U,148,149,130,50,51,DEN,SEA,1024,4,14,0,,0 +1996,9,28,6,630,630,715,717,AS,95,N763AS,45,47,29,-2,0,PDX,SEA,129,4,12,0,,0 +1996,9,2,1,1305,1225,1512,1451,US,57,N526AU,307,326,291,21,40,CLT,SFO,2296,6,10,0,,0 +1996,9,18,3,1430,1432,1545,1549,UA,2046,N385UA,75,77,55,-4,-2,LAX,SFO,337,3,17,0,,0 +1996,9,1,7,1832,1835,1945,2000,UA,2356,N927UA,73,85,63,-15,-3,SAN,SFO,447,2,8,0,,0 +1996,9,2,1,1710,1710,1805,1810,WN,1277,N380,55,60,43,-5,0,LAX,SJC,308,5,7,0,,0 +1996,9,27,5,1735,1730,1912,1857,DL,947,N297WA,97,87,75,15,5,ABQ,SLC,493,7,15,0,,0 +1996,9,8,7,812,815,1044,1037,DL,1137,N527DA,212,202,196,7,-3,MSY,SLC,1428,6,10,0,,0 +1996,9,9,1,1546,1515,1707,1635,WN,1714,N384,81,80,64,32,31,LAS,SMF,397,3,14,0,,0 +1996,9,19,4,1855,1836,2011,1948,HP,10,N315AW,76,72,50,23,19,PHX,S,338,4,22,0,,0 +1996,9,15,7,1830,1830,1906,1858,TW,211,EI-CIW,96,88,72,8,0,CMH,STL,410,10,14,0,,0 +1996,9,16,1,803,805,1029,933,TW,656,N925L,146,88,90,56,-2,JAN,STL,444,5,51,0,,0 +1996,9,9,1,1910,1910,2014,2021,TW,636,N84355,64,71,52,-7,0,OMA,STL,342,4,8,0,,0 +1996,9,28,6,753,755,903,905,TW,62,N64319,70,70,51,-2,-2,TUL,STL,351,10,9,0,,0 +1996,9,24,2,1235,1220,1517,1504,CO,437,N15841,162,164,130,13,15,EWR,TPA,998,3,29,0,,0 +1996,9,23,1,2024,2025,2107,2112,UA,589,N364UA,103,107,88,-5,-1,DEN,TUS,639,6,9,0,,0 +1996,9,12,4,1814,1810,1929,1929,UA,2775,N382UA,75,79,53,0,4,SFO,LAX,337,11,11,0,,0 +1996,9,9,1,1051,1020,1217,1144,CO,1126,N63305,86,84,66,33,31,CLE,LGA,418,7,13,0,,0 +1996,9,29,7,,930,,1302,NW,504,N309RC,,152,,,,MSP,LGA,1020,0,0,1,,0 +1996,9,26,4,,1125,,1243,TW,619,N490SA,,78,,,,STL,LNK,370,0,0,1,,0 +1996,9,26,4,820,815,1006,931,UA,637,N7290U,106,76,70,35,5,ORD,MCI,403,3,33,0,,0 +1996,9,13,5,951,925,1237,1208,CO,607,N15820,166,163,129,29,26,EWR,MCO,938,7,30,0,,0 +1996,9,16,1,1840,1840,2008,2010,WN,625,N359,88,90,82,-2,0,BHM,MDW,570,2,4,0,,0 +1996,9,2,1,1113,1115,1248,1252,NW,779,N921RW,95,97,81,-4,-2,AUS,MEM,559,4,10,0,,0 +1996,9,13,5,2013,2015,2115,2120,CO,1917,N17533,62,65,46,-5,-2,IAH,MFE,316,5,11,0,,0 +1996,9,23,1,1329,1330,1618,1617,AA,463,N705AA,169,167,143,1,-1,LGA,MIA,1097,8,18,0,,0 +1996,9,18,3,1325,1325,1329,1330,DL,1905,N908DE,64,65,44,-1,0,ATL,MOB,302,6,14,0,,0 +1996,9,29,7,558,600,635,644,NW,1252,N8903E,37,44,28,-9,-2,DLH,MSP,144,3,6,0,,0 +1996,9,18,3,528,530,644,649,NW,1280,N8978E,76,79,67,-5,-2,MOT,MSP,449,4,5,0,,0 +1996,9,28,6,627,630,756,801,NW,1045,N926RC,89,91,69,-5,-3,STL,MSP,449,9,11,0,,0 +1996,9,28,6,1013,1014,1201,1204,TW,185,N412EA,108,110,94,-3,-1,STL,MSY,604,4,10,0,,0 +1996,9,27,5,1413,1405,1525,1525,WN,833,N307,72,80,63,0,8,SAN,OAK,446,2,7,0,,0 +1996,9,29,7,1644,1630,1757,1750,WN,945,N351,73,80,66,7,14,MDW,OMA,423,2,5,0,,0 +1996,9,27,5,956,1000,1103,1110,WN,1709,N348,67,70,57,-7,-4,SMF,ONT,389,3,7,0,,0 +1996,9,16,1,1646,1645,1707,1706,UA,129,N510UA,81,81,54,1,1,CLE,ORD,316,8,19,0,,0 +1996,9,2,1,1857,1900,1856,1915,NW,1187,N941N,59,75,42,-19,-3,DTW,ORD,235,5,12,0,,0 +1996,9,26,4,1230,1200,1849,1801,AA,1576,N521AA,259,241,226,48,30,LAX,ORD,1745,7,26,0,,0 +1996,9,9,1,1946,1900,2048,2014,NW,144,N817EA,62,74,46,34,46,MSP,ORD,334,7,9,0,,0 +1996,9,11,3,716,716,801,756,AA,1861,N456AA,105,100,81,5,0,ROC,ORD,528,8,16,0,,0 +1996,9,28,6,1327,1333,1510,1514,AA,1912,N818AA,103,101,82,-4,-6,TUL,ORD,585,11,10,0,,0 +1996,9,17,2,1755,1755,1852,1857,AS,424,N977AS,57,62,40,-5,0,GEG,PDX,279,3,14,0,,0 +1996,9,23,1,1933,1930,2126,2129,DL,1928,N624DL,113,119,90,-3,3,ATL,PHL,665,5,18,0,,0 +1996,9,13,5,1121,1120,1444,1450,US,298,N850US,143,150,131,-6,1,MCI,PHL,1038,4,8,0,,0 +1996,9,10,2,2045,2045,2050,2050,WN,525,N319,65,65,54,0,0,ABQ,PHX,328,4,7,0,,0 +1996,9,27,5,1234,1232,1526,1453,AA,1903,N278AA,232,201,203,33,2,BWI,DFW,1217,10,19,0,,0 +1996,9,21,6,1157,1201,1330,1332,AA,1274,N2BFAA,93,91,77,-2,-4,HRL,DFW,461,9,7,0,,0 +1996,9,5,4,720,720,848,850,DL,691,N981DL,148,150,130,-2,0,MCO,DFW,984,7,11,0,,0 +1996,9,19,4,1243,1208,1654,1629,AA,48,N5CBAA,131,141,110,25,35,PHX,DFW,868,10,11,0,,0 +1996,9,14,6,842,846,1334,1336,AA,1376,N610AA,172,170,146,-2,-4,S,DFW,1205,15,11,0,,0 +1996,9,2,1,1848,1850,1953,1940,NW,1106,N8957E,65,50,32,13,-2,CLE,DTW,95,14,19,0,,0 +1996,9,18,3,48,38,731,720,HP,360,N629AW,223,222,204,11,10,LAS,DTW,1750,7,12,0,,0 +1996,9,30,1,814,815,1002,958,NW,1777,N918RW,108,103,84,4,-1,PHL,DTW,453,14,10,0,,0 +1996,9,13,5,2010,2010,2055,2055,WN,351,N685,105,105,93,0,0,HOU,ELP,677,3,9,0,,0 +1996,9,13,5,1627,1630,2234,2212,CO,140,N17619,247,222,229,22,-3,COS,EWR,1623,6,12,0,,0 +1996,9,27,5,1115,1115,1407,1407,AA,1768,N884AA,172,172,148,0,0,MIA,EWR,1086,6,18,0,,0 +1996,9,17,2,,2250,,24,DL,169,N485DA,,94,,,,JNU,FAI,624,0,0,1,,0 +1996,9,19,4,916,920,1010,1017,NW,611,N297US,174,177,158,-7,-4,MSP,GEG,1175,3,13,0,,0 +1996,9,7,6,1254,1256,1320,1329,US,991,N923VJ,26,33,17,-9,-2,CLT,GSP,75,2,7,0,,0 +1996,9,19,4,1531,1515,1628,1610,WN,42,N103,57,55,47,18,16,HRL,HOU,276,3,7,0,,0 +1996,9,16,1,1458,1455,1643,1626,UA,1208,N7298U,105,91,79,17,3,BOS,IAD,413,6,20,0,,0 +1996,9,16,1,1345,1340,1649,1644,CO,425,N15841,244,244,228,5,5,BOS,IAH,1597,4,12,0,,0 +1996,9,17,2,1117,1120,1251,1240,CO,1146,N12235,94,80,73,11,-3,LBB,IAH,458,7,14,0,,0 +1996,9,20,5,753,755,1330,1344,CO,185,N14346,217,229,194,-14,-2,SFO,IAH,1635,9,14,0,,0 +1996,9,13,5,1327,1330,1412,1419,US,1103,N890US,105,109,91,-7,-3,PHL,IND,587,3,11,0,,0 +1996,9,29,7,2343,2230,710,605,TW,778,N691LF,267,275,247,65,73,LAS,JFK,2248,5,15,0,,0 +1996,9,26,4,1955,1955,2235,2212,DL,1909,N614DL,340,317,312,23,0,BOS,LAS,2381,6,22,0,,0 +1996,9,21,6,825,825,918,915,WN,1451,N387,173,170,158,3,0,MCI,LAS,1140,2,13,0,,0 +1996,9,27,5,1010,1010,1129,1129,HP,2824,N145AW,79,79,66,0,0,SFO,LAS,414,3,10,0,,0 +1996,9,10,2,2221,2225,4,13,NW,339,N345NW,283,288,257,-9,-4,DTW,LAX,1979,4,22,0,,0 +1996,9,5,4,809,810,1006,1012,UA,491,N419UA,297,302,277,-6,-1,MCO,LAX,2217,5,15,0,,0 +1996,9,9,1,1749,1750,1901,1908,UA,2788,N928UA,72,78,60,-7,-1,PHX,LAX,370,5,7,0,,0 +1996,9,2,1,1605,1605,1600,1600,WN,977,N626,55,55,45,0,0,LBB,ABQ,289,3,7,0,,0 +1996,9,2,1,,630,,853,AS,81,UNKNOW,,203,,,,SEA,ANC,1449,0,0,1,,0 +1996,9,26,4,831,830,947,935,US,883,N914VJ,76,65,44,12,1,CLT,ATL,227,4,28,0,,0 +1996,9,16,1,1915,1900,2025,2010,DL,871,N903DL,70,70,55,15,15,GSO,ATL,306,5,10,0,,0 +1996,9,15,7,539,540,803,740,DL,1503,N919DL,84,60,70,23,-1,MEM,ATL,332,4,10,0,,0 +1996,9,6,5,2042,2010,2218,2147,DL,1127,N2821W,96,97,75,31,32,PIT,ATL,526,5,16,0,,0 +1996,9,1,7,1243,1245,1404,1411,DL,1818,N907DE,81,86,63,-7,-2,TPA,ATL,406,6,12,0,,0 +1996,9,12,4,700,700,732,735,NW,611,N296US,32,35,20,-3,0,LAN,AZO,62,7,5,0,,0 +1996,9,20,5,935,935,1058,1050,WN,1399,N610,83,75,61,8,0,STL,BHM,410,3,19,0,,0 +1996,9,26,4,744,746,914,900,TW,696,N935L,90,74,48,14,-2,STL,B,271,6,36,0,,0 +1996,9,4,3,1204,1200,1316,1306,CO,352,N13891,72,66,46,10,4,EWR,BOS,200,8,18,0,,0 +1996,9,19,4,1409,1410,1509,1519,US,2445,N519AU,60,69,49,-10,-1,ROC,BOS,343,5,6,0,,0 +1996,9,7,6,750,755,948,958,AS,114,N936AS,118,123,105,-10,-5,PDX,BUR,817,3,10,0,,0 +1996,9,26,4,918,920,1142,1150,US,398,N574US,84,90,69,-8,-2,IND,BWI,515,5,10,0,,0 +1996,9,24,2,844,845,930,935,US,1179,N930VJ,46,50,27,-5,-1,CLT,CHS,168,3,16,0,,0 +1996,9,24,2,1601,1605,1826,1810,CO,1210,N59338,85,65,66,16,-4,MDW,CLE,307,1,18,0,,0 +1996,9,21,6,1314,1315,1410,1411,US,503,N229US,56,56,48,-1,-1,CHA,CLT,242,4,4,0,,0 +1996,9,12,4,1759,1740,2004,1935,US,886,N439US,125,115,90,29,19,LGA,CLT,544,3,32,0,,0 +1996,9,16,1,817,815,1645,1603,US,102,N562AU,328,288,312,42,2,SEA,CLT,2279,5,11,0,,0 +1996,9,17,2,2128,2130,2352,2353,TW,260,N9403W,84,83,52,-1,-2,STL,CMH,410,4,28,0,,0 +1996,9,18,3,1657,1700,1804,1805,NW,1172,N930RC,67,65,45,-1,-3,DTW,CVG,229,6,16,0,,0 +1996,9,19,4,1453,1445,1815,1802,DL,552,N531DA,142,137,130,13,8,SAT,CVG,1024,5,7,0,,0 +1996,9,21,6,1510,1505,1608,1605,WN,39,N369,58,60,48,3,5,LIT,DAL,296,1,9,0,,0 +1996,9,4,3,1639,1640,1746,1752,US,1126,N373US,67,72,53,-6,-1,CLT,DCA,331,4,10,0,,0 +1996,9,28,6,1015,1015,1308,1256,UA,608,N7261U,113,101,90,12,0,ORD,DCA,612,3,20,0,,0 +1996,9,18,3,1031,1003,1109,1049,UA,425,N328UA,98,106,83,20,28,DSM,DEN,589,6,9,0,,0 +1996,9,2,1,1436,1438,1743,1747,UA,716,N389UA,127,129,112,-4,-2,ONT,DEN,819,6,9,0,,0 +1996,10,11,5,710,710,731,725,WN,76,N608,141,135,126,6,0,AUS,PHX,872,4,11,0,,0 +1996,10,2,3,1830,1830,1926,1930,WN,595,N600,56,60,44,-4,0,LAS,PHX,256,2,10,0,,0 +1996,10,20,7,2157,2155,2342,2325,AA,483,N410AA,225,210,203,17,2,ORD,PHX,1440,4,18,0,,0 +1996,10,13,7,817,820,929,939,HP,2842,N164AW,192,199,170,-10,-3,STL,PHX,1262,8,14,0,,0 +1996,10,28,1,1924,1925,2040,2027,US,1106,N981US,76,62,52,13,-1,CVG,PIT,256,6,18,0,,0 +1996,10,17,4,1037,1040,1259,1300,US,1240,N355US,82,80,67,-1,-3,MKE,PIT,431,5,10,0,,0 +1996,10,8,2,2221,2145,2251,2224,DL,1222,N3301,90,99,74,27,36,SLC,PSC,521,5,11,0,,0 +1996,10,5,6,2039,2045,2326,2333,AA,1418,N451AA,107,108,82,-7,-6,ORD,RDU,647,10,15,0,,0 +1996,10,11,5,2209,2150,2252,2220,DL,1667,N312WA,103,90,65,32,19,SLC,RNO,422,2,36,0,,0 +1996,10,3,4,1859,1847,1956,1948,AA,1212,N589AA,177,181,156,8,12,DFW,SAN,1171,4,17,0,,0 +1996,10,27,7,820,820,930,935,WN,263,N314,70,75,60,-5,0,SJC,SAN,417,2,8,0,,0 +1996,10,14,1,834,820,1234,1220,WN,702,N89,120,120,109,14,14,PHX,SAT,843,2,9,0,,0 +1996,10,11,5,1014,920,1214,1127,DL,835,N727DA,300,307,282,47,54,ATL,SEA,2182,5,13,0,,0 +1996,10,11,5,2156,2200,38,15,AA,293,N562AA,282,255,248,23,-4,ORD,SEA,1721,8,26,0,,0 +1996,10,21,1,1006,900,1306,1221,UA,33,N510UA,360,381,339,45,66,BOS,SFO,2704,6,15,0,,0 +1996,10,27,7,750,750,902,913,UA,2310,N354UA,72,83,60,-11,0,LAS,SFO,414,4,8,0,,0 +1996,10,15,2,1253,1248,1444,1444,UA,2301,N916UA,111,116,99,0,5,PHX,SFO,651,1,11,0,,0 +1996,10,14,1,1138,1137,1312,1310,UA,451,N331UA,154,153,132,2,1,DEN,SJC,948,4,18,0,,0 +1996,10,14,1,1114,1059,1654,1635,AA,1894,N621AA,280,276,246,19,15,DFW,SJU,2165,17,17,0,,0 +1996,10,8,2,36,37,251,246,HP,2780,N180AW,75,69,54,5,-1,LAS,SLC,368,10,11,0,,0 +1996,10,2,3,1304,1305,1533,1526,DL,2068,N504DA,89,81,75,7,-1,SMF,SLC,532,5,9,0,,0 +1996,10,12,6,1105,1056,1205,1204,AA,1317,N5CUAA,180,188,153,1,9,DFW,S,1205,8,19,0,,0 +1996,10,8,2,953,955,1050,1034,TW,469,N84357,117,99,75,16,-2,ATL,STL,483,25,17,0,,0 +1996,10,5,6,925,920,949,958,TW,431,N54332,84,98,67,-9,5,DTW,STL,440,4,13,0,,0 +1996,10,10,4,1441,1430,1555,1556,TW,635,N11004,134,146,120,-1,11,MCO,STL,880,5,9,0,,0 +1996,10,12,6,1149,1150,1306,1240,US,761,N956VJ,137,110,100,26,-1,PIT,STL,553,3,34,0,,0 +1996,10,8,2,1601,1600,1658,1656,US,1118,N929VJ,57,56,42,2,1,PHL,SYR,228,4,11,0,,0 +1996,10,16,3,1715,1715,1943,1945,WN,1632,N63,88,90,76,-2,0,MSY,TPA,487,5,7,0,,0 +1996,10,2,3,1759,1745,1901,1850,WN,1075,N682,62,65,54,11,14,SAN,TUS,367,2,6,0,,0 +1996,10,8,2,1115,1035,1236,1202,DL,1966,N406DA,81,87,63,34,40,TUS,LAX,451,5,13,0,,0 +1996,10,3,4,1038,1035,1604,1608,UA,1576,N351UA,206,213,189,-4,3,DEN,LGA,1619,5,12,0,,0 +1996,10,7,1,1646,1645,1801,1801,US,446,N288AU,75,76,56,0,1,ORF,LGA,296,10,9,0,,0 +1996,10,24,4,1258,1245,1539,1530,WN,282,N621,101,105,92,9,13,ABQ,MCI,718,3,6,0,,0 +1996,10,6,7,1616,1600,1711,1704,TW,191,N64320,55,64,41,7,16,STL,MCI,237,3,11,0,,0 +1996,10,9,3,900,900,940,950,WN,1253,N61,40,50,33,-10,0,FLL,MCO,178,2,5,0,,0 +1996,10,30,3,1835,1835,2010,2010,WN,625,N510,95,95,87,0,0,BHM,MDW,570,3,5,0,,0 +1996,10,12,6,1214,1215,1226,1232,DL,1284,N236WA,72,77,54,-6,-1,ATL,MEM,332,5,13,0,,0 +1996,10,11,5,1856,1900,1905,1911,NW,1567,N670MC,69,71,55,-6,-4,TYS,MEM,342,5,9,0,,0 +1996,10,1,2,1500,1500,1804,1803,AA,99,N5DUAA,184,183,160,1,0,JFK,MIA,1090,5,19,0,,0 +1996,10,4,5,1348,1350,1523,1522,US,579,N920VJ,95,92,69,1,-2,CLT,MLB,490,3,23,0,,0 +1996,10,20,7,1056,1100,1412,1352,NW,564,N292US,136,112,94,20,-4,DEN,MSP,680,2,40,0,,0 +1996,10,6,7,1633,1630,1844,1904,NW,589,N313US,191,214,172,-20,3,MCO,MSP,1310,4,15,0,,0 +1996,10,19,6,1157,1200,1709,1705,NW,96,N229NW,192,185,161,4,-3,SEA,MSP,1399,15,16,0,,0 +1996,10,18,5,1152,1150,1251,1252,CO,1625,N541NY,59,62,43,-1,2,IAH,MSY,305,4,12,0,,0 +1996,10,7,1,1541,1500,1652,1605,WN,1719,N365,71,65,50,47,41,LAX,OAK,337,4,17,0,,0 +1996,10,22,2,1604,1525,1717,1640,WN,1175,N53,73,75,64,37,39,HOU,OKC,419,3,6,0,,0 +1996,10,23,3,1947,1947,2145,2148,AS,578,N943AS,118,121,100,-3,0,PDX,ONT,838,5,13,0,,0 +1996,10,9,3,1630,1630,1754,1759,UA,1527,N7264U,84,89,64,-5,0,B,ORD,409,12,8,0,,0 +1996,10,10,4,1659,1700,1800,1758,UA,815,N566UA,121,118,92,2,-1,DCA,ORD,612,10,19,0,,0 +1996,10,28,1,1822,1826,1955,1945,AA,1995,N2CLAA,153,139,131,10,-4,HPN,ORD,738,11,11,0,,0 +1996,10,8,2,902,900,1023,1021,UA,288,N9002U,81,81,67,2,2,LNK,ORD,466,8,6,0,,0 +1996,10,5,6,639,642,1241,1231,AA,2098,N202AA,242,229,209,10,-3,PDX,ORD,1739,10,23,0,,0 +1996,10,8,2,1509,1511,2116,2115,AA,758,N226AA,247,244,223,1,-2,SFO,ORD,1846,9,15,0,,0 +1996,10,26,6,1330,1330,1419,1422,US,554,N255AU,49,52,39,-3,0,PHL,ORF,211,3,7,0,,0 +1996,10,15,2,2028,2028,2200,2158,AS,337,N938AS,92,90,81,2,0,OAK,PDX,543,4,7,0,,0 +1996,10,18,5,1510,1510,1629,1629,US,1475,N965VJ,79,79,65,0,0,BTV,PHL,336,5,9,0,,0 +1996,10,16,3,1445,1445,1821,1809,NW,684,N8929E,156,144,139,12,0,MSP,PHL,980,6,11,0,,0 +1996,10,4,5,1340,1336,1623,1615,AA,622,N614AA,103,99,84,8,4,ABQ,DFW,569,7,12,0,,0 +1996,10,2,3,1356,1400,1635,1645,AA,2034,N491AA,99,105,80,-10,-4,COS,DFW,592,6,13,0,,0 +1996,10,31,4,2212,2215,2302,2317,CO,541,N17619,50,62,37,-15,-3,IAH,DFW,224,5,8,0,,0 +1996,10,24,4,657,700,840,832,AA,1802,N2CA,103,92,74,8,-3,MFE,DFW,468,17,12,0,,0 +1996,10,20,7,740,743,1210,1157,AA,1502,N495AA,150,134,125,13,-3,PHX,DFW,868,6,19,0,,0 +1996,10,6,7,1000,1004,1509,1501,AA,738,N227AA,189,177,153,8,-4,S,DFW,1205,8,28,0,,0 +1996,10,18,5,1936,1940,2116,2115,NW,1137,N529US,100,95,67,1,-4,BWI,DTW,408,18,15,0,,0 +1996,10,28,1,1137,1140,1238,1254,NW,1520,N780NC,61,74,43,-16,-3,IND,DTW,231,10,8,0,,0 +1996,10,6,7,1036,1040,1245,1255,NW,1536,N712RC,69,75,46,-10,-4,ORD,DTW,235,10,13,0,,0 +1996,10,10,4,1220,1110,1322,1200,WN,803,N349,62,50,40,82,70,ABQ,ELP,223,3,19,0,,0 +1996,10,22,2,657,700,846,843,CO,441,N62631,109,103,93,3,-3,CHS,EWR,628,9,7,0,,0 +1996,10,18,5,2158,2200,540,520,DL,542,N625DL,282,260,254,20,-2,LAS,EWR,2227,10,18,0,,0 +1996,10,11,5,1705,1705,1912,1900,CO,1768,N24633,127,115,111,12,0,SDF,EWR,642,6,10,0,,0 +1996,10,26,6,125,115,150,137,DL,1490,N1402A,25,22,11,13,10,MIA,FLL,21,3,11,0,,0 +1996,10,10,4,1844,1745,1944,1856,US,862,N886US,60,71,48,48,59,PIT,GRR,319,4,8,0,,0 +1996,10,20,7,1700,1700,1740,1745,WN,853,N602,40,45,32,-5,0,AUS,HOU,148,2,6,0,,0 +1996,10,12,6,1520,1400,1707,1600,WN,589,N28,107,120,92,67,80,STL,HOU,687,2,13,0,,0 +1996,10,12,6,1327,1330,1551,1559,UA,914,N4714U,144,149,116,-8,-3,MIA,IAD,921,9,19,0,,0 +1996,10,12,6,1253,1250,1354,1353,AA,2053,N2AJAA,61,63,39,1,3,DFW,IAH,224,6,16,0,,0 +1996,10,31,4,1453,1455,1600,1600,CO,1643,N70755,67,65,54,0,-2,MSY,IAH,305,6,7,0,,0 +1996,10,31,4,1908,1855,2110,2045,UA,553,N9067U,122,110,99,25,13,ORD,ICT,588,5,18,0,,0 +1996,10,6,7,1633,1620,1723,1709,DL,1691,N3301,50,49,33,14,13,SLC,JAC,205,3,14,0,,0 +1996,10,14,1,1713,1700,2013,1958,AA,2198,N613AA,180,178,141,15,13,MIA,JFK,1090,8,31,0,,0 +1996,10,26,6,1603,1558,1652,1645,AA,1117,N207AA,169,167,144,7,5,DFW,LAS,1055,5,20,0,,0 +1996,10,10,4,2200,2155,2330,2335,AA,585,N262AA,210,220,191,-5,5,ORD,LAS,1515,5,14,0,,0 +1996,10,18,5,2021,1955,2109,2005,WN,1256,N376,108,70,61,64,26,SLC,LAS,368,2,45,0,,0 +1996,10,25,5,2318,2220,723,616,DL,1976,N1731D,305,296,279,67,58,HNL,LAX,2556,11,15,0,,0 +1996,10,11,5,1456,1420,1605,1536,UA,2243,N912UA,69,76,56,29,36,OAK,LAX,337,7,6,0,,0 +1996,10,3,4,835,830,954,950,WN,1188,N356,79,80,60,4,5,PHX,LAX,370,4,15,0,,0 +1996,10,30,3,1822,1745,2050,2025,WN,539,N614,88,100,76,25,37,LAX,ABQ,677,2,10,0,,0 +1996,10,30,3,1110,934,1237,1101,AS,52,N741AS,87,87,79,96,96,OTZ,ANC,549,4,4,0,,0 +1996,10,14,1,828,830,933,935,US,883,N952VJ,65,65,38,-2,-2,CLT,ATL,227,4,23,0,,0 +1996,10,7,1,1004,1005,1116,1108,DL,1068,N369DL,72,63,61,8,-1,GNV,ATL,300,6,5,0,,0 +1996,10,1,2,608,610,731,728,DL,1914,N647DL,83,78,66,3,-2,MCO,ATL,403,8,9,0,,0 +1996,10,24,4,531,530,736,730,DL,2031,N917DE,125,120,102,6,1,PHL,ATL,665,7,16,0,,0 +1996,10,24,4,1653,1655,1924,1929,TW,534,N925L,91,94,65,-5,-2,STL,ATL,483,10,16,0,,0 +1996,10,29,2,845,845,1152,1145,WN,687,N104,127,120,101,7,0,PHX,AUS,872,2,24,0,,0 +1996,10,8,2,1449,1400,1455,1421,US,556,N941VJ,66,81,54,34,49,CLT,BHM,351,2,10,0,,0 +1996,10,22,2,1608,1545,1751,1655,WN,413,N629,103,70,68,56,23,MDW,B,395,3,32,0,,0 +1996,10,21,1,1613,1600,1731,1726,US,934,N885US,78,86,61,5,13,DCA,BOS,399,9,8,0,,0 +1996,10,21,1,629,630,1001,939,AA,650,N262AA,152,129,136,22,-1,ORD,BOS,867,5,11,0,,0 +1996,10,16,3,1739,1740,1856,1902,CO,1090,N24213,77,82,51,-6,-1,EWR,BUF,282,3,23,0,,0 +1996,10,15,2,1826,1810,2059,2045,WN,1527,N602,93,95,82,14,16,B,BWI,588,3,8,0,,0 +1996,10,13,7,915,915,1040,1040,WN,1530,N392,85,85,78,0,0,SDF,BWI,495,1,6,0,,0 +1996,10,17,4,1213,1215,1348,1344,US,353,N281AU,95,89,81,4,-2,CLT,CLE,430,4,10,0,,0 +1996,10,25,5,2236,2240,601,557,CO,506,N59338,265,257,247,4,-4,SEA,CLE,2021,5,13,0,,0 +1996,10,26,6,757,800,1115,1126,US,1194,N259AU,138,146,116,-11,-3,DFW,CLT,936,11,11,0,,0 +1996,10,11,5,757,801,851,848,US,312,N926VJ,54,47,36,3,-4,MYR,CLT,156,9,9,0,,0 +1996,10,8,2,2108,2110,2231,2234,DL,1220,N638DL,83,84,57,-3,-2,ATL,CMH,446,7,19,0,,0 +1996,10,3,4,924,910,1021,1003,NW,667,N8878Z,177,173,156,18,14,DTW,COS,1146,7,14,0,,0 +1996,10,24,4,1019,1020,1159,1158,DL,321,N980DL,40,38,25,1,-1,IND,CVG,98,5,10,0,,0 +1996,10,19,6,1404,1405,1922,1915,DL,826,N119DL,198,190,172,7,-1,SLC,CVG,1449,7,19,0,,0 +1996,10,27,7,700,700,819,820,WN,474,N312,79,80,71,-1,0,MSY,DAL,437,3,5,0,,0 +1996,10,24,4,1906,1902,2008,2005,US,515,N919VJ,62,63,46,3,4,CMH,DCA,322,9,7,0,,0 +1996,10,1,2,1316,1314,1556,1554,UA,614,N510UA,100,100,81,2,2,ORD,DCA,612,3,16,0,,0 +1996,10,21,1,1000,955,1139,1050,UA,1561,N907UA,159,115,88,49,5,DFW,DEN,641,8,63,0,,0 +1996,10,28,1,1016,1010,1034,1039,UA,466,N7263U,78,89,66,-5,6,OMA,DEN,472,4,8,0,,0 +1996,11,4,1,2135,2135,2330,2340,DL,755,N493DA,235,245,216,-10,0,ATL,PHX,1587,4,15,0,,0 +1996,11,30,6,2325,2325,118,123,HP,2312,N188AW,53,58,38,-5,0,LAS,PHX,256,3,12,0,,0 +1996,11,28,4,1605,1605,1851,1844,HP,10,N915AW,226,219,207,7,0,ORD,PHX,1440,5,14,0,,0 +1996,11,22,5,2029,2005,2305,2225,WN,1102,N380,216,200,185,40,24,STL,PHX,1262,5,26,0,,0 +1996,11,1,5,1733,1701,2051,2043,US,1220,N818US,138,162,115,8,32,DFW,PIT,1068,8,15,0,,0 +1996,11,11,1,1744,1610,1900,1720,US,79,N613AU,76,70,44,100,94,PHL,PIT,267,7,25,0,,0 +1996,11,8,5,1447,1445,1643,1630,DL,734,N330DL,116,105,101,13,2,CVG,PVD,722,5,10,0,,0 +1996,11,22,5,2137,2140,2239,2238,US,344,N895US,62,58,42,1,-3,CLT,RIC,256,6,14,0,,0 +1996,11,28,4,1207,1210,1341,1320,CO,1046,N12230,94,70,50,21,-3,EWR,ROC,246,9,35,0,,0 +1996,11,8,5,2050,2005,2142,2100,WN,1115,N680,52,55,42,42,45,LAS,SAN,258,2,8,0,,0 +1996,11,3,7,1940,1940,2150,2150,WN,758,N507,130,130,120,0,0,B,SAT,822,2,8,0,,0 +1996,11,3,7,1700,1700,1814,1819,DL,1084,N901DL,74,79,56,-5,0,ATL,SDF,321,6,12,0,,0 +1996,11,27,3,1044,1035,1204,1135,WN,1721,N316,80,60,62,29,9,GEG,SEA,224,3,15,0,,0 +1996,11,9,6,1402,1355,1534,1556,UA,2187,N907UA,92,121,81,-22,7,SFO,SEA,679,3,8,0,,0 +1996,11,1,5,1734,1715,2044,2036,UA,77,N533UA,370,381,328,8,19,EWR,SFO,2565,7,35,0,,0 +1996,11,18,1,1724,1710,1836,1829,UA,2198,N917UA,72,79,53,7,14,ONT,SFO,363,4,15,0,,0 +1996,11,15,5,1146,1145,1233,1243,UA,2599,N325UA,107,118,88,-10,1,SLC,SFO,599,4,15,0,,0 +1996,11,21,4,1821,1755,1946,1910,WN,1018,N636,85,75,70,36,26,SAN,SJC,417,2,13,0,,0 +1996,11,4,1,1051,1050,1233,1236,AA,765,N2BAAA,162,166,148,-3,1,DFW,SLC,988,4,10,0,,0 +1996,11,21,4,1104,1025,1341,1306,DL,1070,N306WA,97,101,84,35,39,SAN,SLC,626,3,10,0,,0 +1996,11,10,7,2226,2235,2303,2315,DL,1619,N962DL,37,40,22,-12,-9,SJC,SMF,94,5,10,0,,0 +1996,11,10,7,1110,1111,1425,1435,TW,160,EI-CIW,135,144,121,-10,-1,ABQ,STL,934,4,10,0,,0 +1996,11,18,1,716,710,818,753,NW,1211,N716RC,122,103,101,25,6,DTW,STL,440,6,15,0,,0 +1996,11,27,3,1500,1500,1603,1610,WN,103,N51,63,70,50,-7,0,MDW,STL,251,5,8,0,,0 +1996,11,25,1,839,840,1430,1410,TW,230,N959U,231,210,214,20,-1,SAN,STL,1558,6,11,0,,0 +1996,11,13,3,1357,1355,1525,1520,DL,307,N1402A,88,85,60,5,2,ATL,TPA,406,4,24,0,,0 +1996,11,26,2,1902,1840,2225,2203,TW,204,N54344,143,143,107,22,22,STL,TPA,869,5,31,0,,0 +1996,11,5,2,1427,1430,1645,1652,UA,769,N9015U,78,82,65,-7,-3,ORD,TYS,475,2,11,0,,0 +1996,11,3,7,1730,1730,1840,1832,DL,1843,N481DA,70,62,48,8,0,BOS,LGA,185,3,19,0,,0 +1996,11,14,4,1959,1955,2313,2315,NW,988,N341NW,134,140,116,-2,4,MEM,LGA,963,8,10,0,,0 +1996,11,3,7,1419,1420,1522,1532,TW,279,N416EA,63,72,44,-10,-1,STL,LIT,296,5,14,0,,0 +1996,11,25,1,1807,1810,1927,1942,NW,1252,N945N,80,92,61,-15,-3,MSP,MCI,393,7,12,0,,0 +1996,11,16,6,826,830,1036,1046,US,2299,N449US,130,136,115,-10,-4,DCA,MCO,759,5,10,0,,0 +1996,11,8,5,702,700,954,1000,DL,2417,N322DL,172,180,156,-6,2,PVD,MCO,1073,6,10,0,,0 +1996,11,20,3,,1500,,1627,NW,1026,N307RC,,87,,,,MSP,MDW,349,0,0,1,,0 +1996,11,14,4,1838,1800,1939,1912,NW,864,N299US,61,72,50,27,38,MSY,MEM,349,3,8,0,,0 +1996,11,17,7,1922,1920,2322,2303,DL,832,N911DA,180,163,138,19,2,DFW,MIA,1121,6,36,0,,0 +1996,11,12,2,1830,1830,1933,1946,NW,102,N162US,63,76,40,-13,0,MSP,MKE,297,4,19,0,,0 +1996,11,27,3,1059,1105,1146,1152,DL,1536,N237WA,107,107,92,-6,-6,CVG,MSP,596,3,12,0,,0 +1996,11,28,4,1418,1420,1530,1537,NW,222,N759NW,72,77,61,-7,-2,MCI,MSP,393,5,6,0,,0 +1996,11,21,4,1226,1200,1721,1704,NW,96,N224NW,175,184,155,17,26,SEA,MSP,1399,11,9,0,,0 +1996,11,9,6,1758,1800,2016,2033,TW,881,N920TW,198,213,175,-17,-2,JFK,MSY,1182,5,18,0,,0 +1996,11,26,2,2042,1945,2238,2209,UA,469,N7456U,236,264,219,29,57,ORD,OAK,1835,5,12,0,,0 +1996,11,1,5,1649,1649,1849,1826,TW,519,N913TW,120,97,91,23,0,STL,OKC,462,7,22,0,,0 +1996,11,15,5,2003,1955,2106,2107,UA,2327,N372UA,63,72,50,-1,8,SFO,ONT,363,2,11,0,,0 +1996,11,11,1,1104,1100,1131,1138,UA,1815,N9067U,87,98,74,-7,4,BUF,ORD,473,2,11,0,,0 +1996,11,6,3,1233,1140,1330,1249,UA,391,N9054U,57,69,43,41,53,DSM,ORD,299,4,10,0,,0 +1996,11,21,4,1423,1420,1933,1947,AA,1664,N642AA,190,207,170,-14,3,LAS,ORD,1515,5,15,0,,0 +1996,11,14,4,1113,1115,1224,1234,AA,654,N2DJAA,71,79,55,-10,-2,MSP,ORD,334,4,12,0,,0 +1996,11,26,2,909,905,1037,1041,UA,565,N912UA,148,156,129,-4,4,PWM,ORD,900,9,10,0,,0 +1996,11,28,4,959,1002,1103,1105,AA,867,N568AA,124,123,95,-2,-3,SYR,ORD,607,10,19,0,,0 +1996,11,14,4,1655,1655,1923,1908,AS,367,N948AS,148,133,124,15,0,BUR,PDX,817,5,19,0,,0 +1996,11,11,1,1700,1700,1816,1825,WN,1714,N623,76,85,67,-9,0,SMF,PDX,479,3,6,0,,0 +1996,11,10,7,1553,1550,2004,1952,CO,1796,N69803,191,182,171,12,3,IAH,PHL,1324,4,16,0,,0 +1996,11,19,2,1157,1155,2011,2010,US,66,N530AU,314,315,280,1,2,SFO,PHL,2521,4,30,0,,0 +1996,11,23,6,1245,1245,1405,1402,DL,1103,N475DA,80,77,64,3,0,BTR,DFW,383,10,6,0,,0 +1996,11,1,5,1901,1842,2101,2053,AA,1281,N2DHAA,180,191,165,8,19,GSO,DFW,999,8,7,0,,0 +1996,11,18,1,1734,1738,1939,1938,AA,1079,N422AA,185,180,156,1,-4,MCO,DFW,984,20,9,0,,0 +1996,11,12,2,558,559,834,837,AA,1649,N716AA,216,218,187,-3,-1,PHL,DFW,1302,9,20,0,,0 +1996,11,3,7,1213,1217,1803,1739,AA,848,N223AA,230,202,167,24,-4,SMF,DFW,1431,52,11,0,,0 +1996,11,2,6,1246,1250,1426,1420,NW,1139,N9341,100,90,74,6,-4,BWI,DTW,408,12,14,0,,0 +1996,11,11,1,1037,1040,1118,1122,NW,242,N289US,41,42,23,-4,-3,LAN,DTW,74,10,8,0,,0 +1996,11,24,7,1237,1240,2011,1947,NW,894,N326US,274,247,254,24,-3,PDX,DTW,1953,10,10,0,,0 +1996,11,17,7,2027,2025,2107,2106,DL,183,N326DL,100,101,80,1,2,DFW,ELP,551,3,17,0,,0 +1996,11,1,5,809,810,1330,1347,CO,142,N60312,201,217,180,-17,-1,COS,EWR,1623,5,16,0,,0 +1996,11,5,2,1344,1345,1705,1725,NW,792,N783NC,141,160,128,-20,-1,MEM,EWR,946,7,6,0,,0 +1996,11,15,5,1642,1632,1734,1725,AS,93,N937AS,52,53,39,9,10,ANC,FAI,261,2,11,0,,0 +1996,11,9,6,1442,1440,1527,1536,NW,1807,N92S,45,56,33,-9,2,MSP,FSD,197,4,8,0,,0 +1996,11,8,5,1420,1420,1536,1524,US,511,N985VJ,76,64,59,12,0,PIT,GSO,304,3,14,0,,0 +1996,11,11,1,1930,1845,2122,2055,NW,275,N958N,172,190,154,27,45,DTW,HOU,1093,5,13,0,,0 +1996,11,22,5,1447,1445,1654,1620,UA,918,N418UA,127,95,110,34,2,ATL,IAD,533,7,10,0,,0 +1996,11,29,5,1015,1015,1322,1331,CO,185,N16892,247,256,220,-9,0,BOS,IAH,1597,15,12,0,,0 +1996,11,18,1,715,715,1221,1227,CO,1836,N73751,186,192,164,-6,0,LAX,IAH,1379,6,16,0,,0 +1996,11,7,4,1505,1450,2026,2022,CO,228,N45793,201,212,172,4,15,SFO,IAH,1635,10,19,0,,0 +1996,11,26,2,1516,1514,1717,1708,UA,1590,N337UA,61,54,34,9,2,ORD,IND,177,8,19,0,,0 +1996,11,4,1,2159,2200,539,604,AA,10,N167AA,280,304,256,-25,-1,LAX,JFK,2475,6,18,0,,0 +1996,11,30,6,924,905,1057,1050,CO,1745,N14816,273,285,250,7,19,CLE,LAS,1825,4,19,0,,0 +1996,11,10,7,1540,1540,1620,1625,WN,332,N625,160,165,151,-5,0,OMA,LAS,1099,4,5,0,,0 +1996,11,30,6,850,850,856,907,DL,1098,N543DA,66,77,51,-11,0,SLC,LAS,368,5,10,0,,0 +1996,11,2,6,1712,1710,14,22,NW,936,N158US,302,312,280,-8,2,HNL,LAX,2556,4,18,0,,0 +1996,11,11,1,1312,1315,1418,1429,UA,2861,N365UA,66,74,51,-11,-3,OAK,LAX,337,7,8,0,,0 +1996,11,30,6,701,700,747,745,DL,203,N784DA,46,45,22,2,1,SAN,LAX,109,5,19,0,,0 +1996,11,17,7,650,650,856,910,WN,352,N370,66,80,58,-14,0,LAS,ABQ,487,2,6,0,,0 +1996,11,27,3,2135,2116,2258,2241,AS,58,N730AS,83,85,75,17,19,OME,ANC,539,3,5,0,,0 +1996,11,27,3,915,915,1036,1045,DL,535,N623DL,81,90,63,-9,0,CMH,ATL,446,10,8,0,,0 +1996,11,3,7,1901,1905,1948,1956,DL,1241,N981DL,47,51,29,-8,-4,GSP,ATL,153,4,14,0,,0 +1996,11,18,1,1050,1050,1240,1236,DL,1054,N903DE,50,46,31,4,0,MGM,ATL,147,10,9,0,,0 +1996,11,9,6,1959,2000,2142,2138,US,1541,N941VJ,103,98,81,4,-1,PIT,ATL,526,10,12,0,,0 +1996,11,28,4,1006,1010,1055,1109,DL,969,N532DA,49,59,38,-14,-4,TYS,ATL,152,5,6,0,,0 +1996,11,6,3,718,720,851,850,CO,550,N12349,93,90,65,1,-2,CLE,BDL,475,5,23,0,,0 +1996,11,16,6,2151,2155,2308,2308,DL,1612,N531DA,77,73,54,0,-4,SLC,BIL,387,3,20,0,,0 +1996,11,17,7,1725,1655,2002,1935,WN,91,N677,97,100,85,27,30,LAS,BOI,520,3,9,0,,0 +1996,11,23,6,634,635,809,803,UA,1701,N568UA,95,88,61,6,-1,IAD,BOS,413,18,16,0,,0 +1996,11,14,4,1258,1300,2119,2128,AA,128,N5CTAA,321,328,303,-9,-2,SJC,BOS,2689,6,12,0,,0 +1996,11,5,2,1045,1045,1115,1110,WN,1737,N382,90,85,65,5,0,PHX,BUR,369,1,24,0,,0 +1996,11,29,5,1748,1750,2001,2001,US,1054,N520AU,133,131,112,0,-2,MCO,BWI,787,9,12,0,,0 +1996,11,13,3,1927,1920,2020,2018,UA,743,N9007U,53,58,34,2,7,ORD,CID,196,5,14,0,,0 +1996,11,6,3,1058,1100,1254,1310,CO,1150,N10236,56,70,44,-16,-2,MKE,CLE,328,4,8,0,,0 +1996,11,17,7,855,856,1004,1010,US,805,N974VJ,69,74,56,-6,-1,CMH,CLT,346,8,5,0,,0 +1996,11,15,5,1145,1145,1409,1412,US,331,N953VJ,84,87,74,-3,0,MEM,CLT,512,5,5,0,,0 +1996,11,24,7,1616,1615,1754,1750,US,217,N442US,98,95,80,4,1,TPA,CLT,508,9,9,0,,0 +1996,11,23,6,,2030,,2105,UA,1031,N7448U,,35,,,,DEN,COS,72,0,0,1,,0 +1996,11,5,2,1411,1415,1514,1517,DL,1717,N374DL,63,62,47,-3,-4,GRR,CVG,268,7,9,0,,0 +1996,11,27,3,859,850,1421,1400,DL,174,N715DA,202,190,165,21,9,SLC,CVG,1449,10,27,0,,0 +1996,11,20,3,700,700,759,745,WN,122,N699,59,45,43,14,0,OKC,DAL,181,3,13,0,,0 +1996,11,30,6,1542,1539,1919,1920,AA,1252,N485AA,157,161,135,-1,3,DFW,DCA,1192,4,18,0,,0 +1996,11,17,7,1225,1225,1318,1321,US,1503,N231US,53,56,41,-3,0,RDU,DCA,227,5,7,0,,0 +1996,11,6,3,1155,1155,1351,1335,UA,1211,N7270U,236,220,213,16,0,IAD,DEN,1452,6,17,0,,0 +1996,11,22,5,1315,1315,1512,1457,HP,2494,N324AW,117,102,78,15,0,PHX,DEN,602,4,35,0,,0 +1996,12,30,1,1013,900,1151,1051,DL,319,N282WA,218,231,203,60,73,CVG,PHX,1569,2,13,0,,0 +1996,12,9,1,1404,1245,1627,1503,HP,2610,N916AW,83,78,50,84,79,LAX,PHX,370,5,28,0,,0 +1996,12,26,4,1411,1235,1642,1510,WN,1726,N354,91,95,81,92,96,RNO,PHX,601,4,6,0,,0 +1996,12,29,7,842,840,920,921,UA,202,N574UA,38,41,27,-1,2,TUS,PHX,110,3,8,0,,0 +1996,12,23,1,805,807,907,900,US,699,N958VJ,62,53,49,7,-2,ELM,PIT,208,6,7,0,,0 +1996,12,8,7,2317,2320,501,518,US,156,N438US,224,238,210,-17,-3,PHX,PIT,1813,5,9,0,,0 +1996,12,23,1,1854,1650,2030,1832,NW,162,N780NC,96,102,79,118,124,DTW,PVD,614,5,12,0,,0 +1996,12,3,2,1812,1815,2008,2001,US,1581,N853US,116,106,88,7,-3,BOS,RIC,474,4,24,0,,0 +1996,12,21,6,1020,1015,1129,1124,US,314,N814US,69,69,51,5,5,DCA,ROC,296,6,12,0,,0 +1996,12,5,4,1727,1725,2044,2029,CO,177,N14107,377,364,347,15,2,EWR,SAN,2425,7,23,0,,0 +1996,12,28,6,818,810,937,930,WN,282,N615,79,80,67,7,8,SMF,SAN,480,2,10,0,,0 +1996,12,26,4,1405,1330,1458,1429,DL,1204,N2819W,53,59,37,29,35,ATL,SAV,215,3,13,0,,0 +1996,12,26,4,1745,1735,1921,1916,UA,1197,N1825U,156,161,135,5,10,DEN,SEA,1024,6,15,0,,0 +1996,12,13,5,1607,1607,1817,1805,AS,719,N937AS,190,178,158,12,0,PHX,SEA,1107,10,22,0,,0 +1996,12,10,2,1414,1240,1624,1431,DL,339,N282WA,310,291,295,113,94,CVG,SFO,2036,6,9,0,,0 +1996,12,5,4,2131,2130,2251,2248,UA,2058,N947UA,80,78,65,3,1,LAX,SFO,337,6,9,0,,0 +1996,12,30,1,2124,1950,2326,2118,UA,2352,N941UA,122,88,108,128,94,SAN,SFO,447,5,9,0,,0 +1996,12,5,4,1113,1100,1221,1205,WN,631,N694,68,65,59,16,13,LAX,SJC,308,2,7,0,,0 +1996,12,14,6,1135,0,1504,0,AA,1305,N063AA,149,150,120,-1,0,MIA,SJU,1045,5,24,0,,0 +1996,12,12,4,1637,1550,1910,1830,WN,1567,N354,93,100,81,40,47,LAX,SLC,590,2,10,0,,0 +1996,12,5,4,800,800,920,910,WN,896,N363,80,70,70,10,0,BUR,SMF,358,5,5,0,,0 +1996,12,26,4,,1607,,1728,AS,98,UNKNOW,,81,,,,OAK,S,371,0,0,1,,0 +1996,12,29,7,1410,1350,1518,1518,TW,85,N9409F,128,148,116,0,20,BWI,STL,737,4,8,0,,0 +1996,12,14,6,1704,1655,1902,1855,WN,371,N395,118,120,110,7,9,HOU,STL,687,2,6,0,,0 +1996,12,22,7,1817,1819,1908,1915,TW,517,N933L,51,56,36,-7,-2,MLI,STL,187,9,6,0,,0 +1996,12,10,2,815,815,1350,1359,TW,174,N651TW,215,224,185,-9,0,SFO,STL,1736,5,25,0,,0 +1996,12,6,5,1308,1230,1523,1453,US,223,N444US,135,143,121,30,38,BWI,TPA,842,4,10,0,,0 +1996,12,9,1,2139,2145,2222,2228,US,1165,N476US,43,43,30,-6,-6,CLT,TRI,120,4,9,0,,0 +1996,12,25,3,1520,1520,1730,1742,TW,96,N491SA,70,82,54,-12,0,STL,TYS,405,2,14,0,,0 +1996,12,4,3,1247,1212,1418,1353,US,1681,N428US,91,101,76,25,35,CLT,LGA,544,3,12,0,,0 +1996,12,3,2,1656,0,2003,0,AA,354,N461AA,127,122,95,1,-4,ORD,LGA,733,15,17,0,,0 +1996,12,4,3,1118,1120,1157,1204,NW,1275,N921RW,39,44,22,-7,-2,MSP,LSE,120,3,14,0,,0 +1996,12,31,2,926,925,1054,1049,UA,393,N9024U,88,84,69,5,1,ORD,MCI,403,5,14,0,,0 +1996,12,23,1,1910,1905,2116,2121,US,2301,N806US,126,136,108,-5,5,DCA,MCO,759,2,16,0,,0 +1996,12,23,1,1007,950,1230,1211,US,999,N262AU,143,141,126,19,17,PHL,MCO,861,4,13,0,,0 +1996,12,14,6,914,915,1043,1042,CO,1481,N69523,149,147,94,1,-1,EWR,MDW,711,3,52,0,,0 +1996,12,16,1,1327,1330,1905,1859,NW,554,N505US,218,209,197,6,-3,LAX,MEM,1619,7,14,0,,0 +1996,12,7,6,2014,2005,2223,2159,US,303,N226US,129,114,104,24,9,CLT,MIA,650,9,16,0,,0 +1996,12,17,2,2216,2100,101,2341,US,1101,N269AU,165,161,152,80,76,PHL,MIA,1013,3,10,0,,0 +1996,12,20,5,1708,1700,1833,1840,DL,1854,N518DA,145,160,126,-7,8,ATL,MSP,906,6,13,0,,0 +1996,12,3,2,730,730,830,822,NW,736,N608NW,60,52,47,8,0,FSD,MSP,197,3,10,0,,0 +1996,12,1,7,1559,1600,1734,1730,NW,139,N779NC,95,90,78,4,-1,ORD,MSP,334,5,12,0,,0 +1996,12,21,6,1717,1630,1817,1735,WN,1379,N683,60,65,49,42,47,BHM,MSY,321,3,8,0,,0 +1996,12,19,4,805,805,905,910,WN,1094,N397,60,65,51,-5,0,BUR,OAK,325,2,7,0,,0 +1996,12,30,1,1905,1845,2116,2040,WN,1723,N676,131,115,110,36,20,SEA,OAK,671,8,13,0,,0 +1996,12,16,1,2010,2005,2314,2303,DL,1698,N2821W,124,118,101,11,5,SLC,OMA,839,3,20,0,,0 +1996,12,2,1,1251,0,1349,0,AA,1531,N2CUAA,118,121,93,-5,-2,ATL,ORD,606,7,18,0,,0 +1996,12,16,1,703,705,1013,1015,UA,634,N7461U,130,130,115,-2,-2,COS,ORD,911,4,11,0,,0 +1996,12,18,3,1833,1817,2015,1956,AA,821,N2BWAA,162,159,132,19,16,EWR,ORD,719,6,24,0,,0 +1996,12,8,7,909,900,1457,1458,UA,106,N547UA,228,238,211,-1,9,LAX,ORD,1745,5,12,0,,0 +1996,12,24,2,,1800,,1930,NW,558,N289US,,90,,,,MSP,ORD,334,0,0,1,,0 +1996,12,31,2,2000,2005,2048,2059,AA,549,N2CTAA,108,114,86,-11,-5,ROC,ORD,528,6,16,0,,0 +1996,12,23,1,,700,,839,UA,265,UNKNOW,,159,,,,TPA,ORD,1012,0,0,1,,0 +1996,12,23,1,934,930,1141,1135,DL,51,N802DE,307,305,289,6,4,ATL,PDX,2172,3,15,0,,0 +1996,12,7,6,1455,1445,1557,1539,DL,417,N497DA,122,114,96,18,10,SLC,PDX,630,5,21,0,,0 +1996,12,23,1,707,710,829,837,US,635,N926VJ,82,87,64,-8,-3,DTW,PHL,453,6,12,0,,0 +1996,12,18,3,1136,1134,1253,1245,US,554,N963VJ,77,71,69,8,2,PVD,PHL,238,3,5,0,,0 +1996,12,10,2,1132,0,1320,0,AA,1355,N2CBAA,108,126,93,-24,-6,B,DFW,631,7,8,0,,0 +1996,12,7,6,1054,0,1328,0,AA,1352,N232AA,94,97,72,-6,-3,ELP,DFW,551,8,14,0,,0 +1996,12,26,4,1756,1759,2103,2110,AA,375,N234AA,247,251,216,-7,-3,LGA,DFW,1389,17,14,0,,0 +1996,12,31,2,1500,1500,1748,1746,AA,2237,N226AA,168,166,112,2,0,ORD,DFW,802,11,45,0,,0 +1996,12,16,1,1045,0,1605,0,AA,544,N210AA,200,226,175,-25,1,SEA,DFW,1660,12,13,0,,0 +1996,12,26,4,2029,1915,2129,2027,UA,1101,N7467U,60,72,43,62,74,ORD,DSM,299,4,13,0,,0 +1996,12,30,1,2000,1925,2157,2129,NW,371,N343NW,117,124,89,28,35,EWR,DTW,487,13,15,0,,0 +1996,12,14,6,1357,1325,1637,1611,NW,862,N786NC,100,106,80,26,32,MEM,DTW,610,9,11,0,,0 +1996,12,8,7,1324,1225,2007,1932,NW,266,N527US,223,247,199,35,59,SEA,DTW,1927,8,16,0,,0 +1996,12,14,6,1745,1730,1909,1859,UA,2222,N919UA,84,89,68,10,15,SFO,EUG,451,2,14,0,,0 +1996,12,12,4,1810,1720,2009,1905,CO,486,N59207,119,105,83,64,50,DTW,EWR,487,6,30,0,,0 +1996,12,8,7,936,930,1231,1220,UA,642,N7451U,115,110,92,11,6,ORD,EWR,719,7,16,0,,0 +1996,12,3,2,1429,1430,1754,1803,US,1438,N824US,205,213,189,-9,-1,BOS,FLL,1237,4,12,0,,0 +1996,12,19,4,1005,940,1105,1036,AS,505,N976AS,60,56,49,29,25,PDX,GEG,279,3,8,0,,0 +1996,12,17,2,1720,1715,1901,1854,NW,1754,N8921E,101,99,83,7,5,DTW,GSP,508,4,14,0,,0 +1996,12,16,1,2045,2045,2140,2140,WN,66,N528,55,55,42,0,0,HRL,HOU,276,5,8,0,,0 +1996,12,10,2,927,920,1046,1053,UA,1123,N412UA,79,93,63,-7,7,BOS,IAD,413,4,12,0,,0 +1996,12,19,4,718,714,905,900,CO,1948,N12532,107,106,94,5,4,BHM,IAH,562,4,9,0,,0 +1996,12,12,4,2058,1800,201,2302,CO,108,N14889,183,182,161,179,178,LAX,IAH,1379,4,18,0,,0 +1996,12,14,6,623,623,726,715,CO,532,N16813,63,52,45,11,0,SAT,IAH,191,6,12,0,,0 +1996,12,11,3,1005,1005,1220,1225,WN,1253,N521,135,140,120,-5,0,MCO,IND,828,6,9,0,,0 +1996,12,14,6,1746,1746,1917,1900,TW,153,N9302B,91,74,50,17,0,BOS,JFK,187,20,21,0,,0 +1996,12,24,2,1810,1755,1832,1820,WN,557,N629,82,85,72,12,15,ABQ,LAS,487,3,7,0,,0 +1996,12,20,5,2342,2230,18,2325,WN,1381,N335,36,55,25,53,72,LAX,LAS,236,3,8,0,,0 +1996,12,4,3,1306,1255,1345,1340,WN,529,N631,159,165,148,5,11,SAT,LAS,1069,3,8,0,,0 +1996,12,24,2,1146,1146,1304,1312,AA,1221,N290AA,198,206,169,-8,0,DFW,LAX,1235,5,24,0,,0 +1996,12,30,1,1820,1755,1924,1900,WN,785,N665,64,65,47,24,25,LAS,LAX,236,4,13,0,,0 +1996,12,18,3,837,840,1112,1130,US,17,N624AU,335,350,309,-18,-3,PHL,LAX,2401,10,16,0,,0 +1996,12,7,6,1538,1525,1714,1640,UA,2443,N901UA,96,75,70,34,13,SFO,LAX,337,10,16,0,,0 +1996,12,2,1,2030,2000,2309,2151,US,185,N587US,279,231,248,78,30,PIT,ABQ,1486,7,24,0,,0 +1996,12,7,6,1715,1655,2014,2001,DL,356,N303DL,119,126,101,13,20,AUS,ATL,813,10,8,0,,0 +1996,12,11,3,1000,1000,1150,1149,DL,1611,N906DE,110,109,84,1,0,DCA,ATL,547,5,21,0,,0 +1996,12,12,4,1711,1715,2015,2011,CO,1006,N69311,124,116,108,4,-4,IAH,ATL,689,5,11,0,,0 +1996,12,18,3,,1720,,2013,DL,1689,N903DL,,113,,,,MKE,ATL,669,0,0,1,,0 +1996,12,10,2,1306,1305,1416,1433,DL,499,N685DA,70,88,55,-17,1,RDU,ATL,356,4,11,0,,0 +1996,12,30,1,2045,2055,2136,2141,DL,1523,N420DA,51,46,28,-5,-10,TYS,ATL,152,9,14,0,,0 +1996,12,13,5,707,710,844,837,CO,550,N16521,97,87,80,7,-3,CLE,BDL,475,5,12,0,,0 +1996,12,26,4,2048,2020,2202,2141,UA,403,N7283U,74,81,62,21,28,DEN,BIL,455,2,10,0,,0 +1996,12,24,2,1601,1602,1654,1713,TW,552,N979Z,53,71,37,-19,-1,STL,B,271,3,13,0,,0 +1996,12,16,1,1056,1100,1157,1206,CO,350,N13881,61,66,40,-9,-4,EWR,BOS,200,6,15,0,,0 +1996,12,11,3,1619,1615,1804,1750,US,76,N633AU,105,95,74,14,4,PIT,BOS,496,13,18,0,,0 +1996,12,16,1,930,930,1027,1030,WN,318,N668,57,60,50,-3,0,OAK,BUR,325,2,5,0,,0 +1996,12,27,5,1114,1044,1506,1428,AA,1944,N813AA,172,164,148,38,30,DFW,BWI,1217,3,21,0,,0 +1996,12,9,1,2018,2020,2103,2059,US,1199,N889US,45,39,19,4,-2,PIT,CAK,70,5,21,0,,0 +1996,12,6,5,754,730,930,908,TW,165,N9302B,96,98,75,22,24,JFK,CLE,425,5,16,0,,0 +1996,12,16,1,,1040,,1254,US,795,UNKNOW,,134,,,,BOS,CLT,728,0,0,1,,0 +1996,12,25,3,1816,1821,1902,1913,US,729,N898US,46,52,33,-11,-5,ILM,CLT,185,6,7,0,,0 +1996,12,1,7,1346,1345,1434,1433,US,2309,N232US,48,48,36,1,1,RDU,CLT,130,4,8,0,,0 +1996,12,1,7,1416,1357,1610,1605,HP,1038,N185AW,114,128,101,5,19,MCO,CMH,802,3,10,0,,0 +1996,12,1,7,606,600,819,802,DL,561,N129DL,133,122,116,17,6,BDL,CVG,661,6,11,0,,0 +1996,12,21,6,1122,1115,1423,1400,DL,936,N373DL,121,105,103,23,7,OKC,CVG,756,9,9,0,,0 +1996,12,11,3,1912,1910,2000,1955,WN,238,N690,48,45,36,5,2,AUS,DAL,189,3,9,0,,0 +1996,12,8,7,1426,1425,1618,1621,UA,1288,N9030U,52,56,39,-3,1,ORD,DAY,240,5,8,0,,0 +1996,12,12,4,930,930,1037,1032,DL,1747,N491DA,67,62,43,5,0,LGA,DCA,214,5,19,0,,0 +1996,12,29,7,753,750,946,946,UA,1601,N979UA,173,176,145,0,3,B,DEN,1013,9,19,0,,0 +1996,12,13,5,1946,1945,2246,2257,UA,358,N407UA,120,132,105,-11,1,LAX,DEN,862,4,11,0,,0 +1996,12,29,7,1304,1255,1611,1604,UA,1760,N364UA,127,129,108,7,9,SAN,DEN,853,4,15,0,,0 diff --git a/Software/MATLAB/script/Examples/outages.parquet b/Software/MATLAB/script/Examples/outages.parquet new file mode 100644 index 0000000..5e51e81 Binary files /dev/null and b/Software/MATLAB/script/Examples/outages.parquet differ diff --git a/Software/MATLAB/script/Examples/states.json b/Software/MATLAB/script/Examples/states.json new file mode 100644 index 0000000..eff6a93 --- /dev/null +++ b/Software/MATLAB/script/Examples/states.json @@ -0,0 +1,59 @@ +{ "name": "Alabama", "abbreviation": "AL" } +{ "name": "Alaska", "abbreviation": "AK" } +{ "name": "American Samoa", "abbreviation": "AS" } +{ "name": "Arizona", "abbreviation": "AZ" } +{ "name": "Arkansas", "abbreviation": "AR" } +{ "name": "California", "abbreviation": "CA" } +{ "name": "Colorado", "abbreviation": "CO" } +{ "name": "Connecticut", "abbreviation": "CT" } +{ "name": "Delaware", "abbreviation": "DE" } +{ "name": "District Of Columbia", "abbreviation": "DC" } +{ "name": "Federated States Of Micronesia", "abbreviation": "FM" } +{ "name": "Florida", "abbreviation": "FL" } +{ "name": "Georgia", "abbreviation": "GA" } +{ "name": "Guam", "abbreviation": "GU" } +{ "name": "Hawaii", "abbreviation": "HI" } +{ "name": "Idaho", "abbreviation": "ID" } +{ "name": "Illinois", "abbreviation": "IL" } +{ "name": "Indiana", "abbreviation": "IN" } +{ "name": "Iowa", "abbreviation": "IA" } +{ "name": "Kansas", "abbreviation": "KS" } +{ "name": "Kentucky", "abbreviation": "KY" } +{ "name": "Louisiana", "abbreviation": "LA" } +{ "name": "Maine", "abbreviation": "ME" } +{ "name": "Marshall Islands", "abbreviation": "MH" } +{ "name": "Maryland", "abbreviation": "MD" } +{ "name": "Massachusetts", "abbreviation": "MA" } +{ "name": "Michigan", "abbreviation": "MI"} +{ "name": "Minnesota", "abbreviation": "MN"} +{ "name": "Mississippi", "abbreviation": "MS" } +{ "name": "Missouri", "abbreviation": "MO" } +{ "name": "Montana", "abbreviation": "MT" } +{ "name": "Nebraska", "abbreviation": "NE" } +{ "name": "Nevada", "abbreviation": "NV" } +{ "name": "New Hampshire","abbreviation": "NH" } +{ "name": "New Jersey", "abbreviation": "NJ" } +{ "name": "New Mexico", "abbreviation": "NM" } +{ "name": "New York", "abbreviation": "NY" } +{ "name": "North Carolina", "abbreviation": "NC"} +{ "name": "North Dakota", "abbreviation": "ND"} +{ "name": "Northern Mariana Islands", "abbreviation": "MP"} +{ "name": "Ohio", "abbreviation": "OH" } +{ "name": "Oklahoma", "abbreviation": "OK" } +{ "name": "Oregon", "abbreviation": "OR" } +{ "name": "Palau", "abbreviation": "PW" } +{ "name": "Pennsylvania", "abbreviation": "PA" } +{ "name": "Puerto Rico", "abbreviation": "PR" } +{ "name": "Rhode Island", "abbreviation": "RI" } +{ "name": "South Carolina", "abbreviation": "SC" } +{ "name": "South Dakota", "abbreviation": "SD" } +{ "name": "Tennessee", "abbreviation": "TN" } +{ "name": "Texas", "abbreviation": "TX" } +{ "name": "Utah", "abbreviation": "UT" } +{ "name": "Vermont","abbreviation": "VT" } +{ "name": "Virgin Islands", "abbreviation": "VI" } +{ "name": "Virginia", "abbreviation": "VA" } +{ "name": "Washington", "abbreviation": "WA" } +{ "name": "West Virginia", "abbreviation": "WV" } +{ "name": "Wisconsin", "abbreviation": "WI" } +{ "name": "Wyoming","abbreviation": "WY" } diff --git a/Software/MATLAB/startup.m b/Software/MATLAB/startup.m new file mode 100644 index 0000000..7c983b0 --- /dev/null +++ b/Software/MATLAB/startup.m @@ -0,0 +1,172 @@ +function startup(varargin) +%% STARTUP - Script to add my paths to MATLAB path +% This script will add the paths below the root directory into the MATLAB +% path. It will omit the SVN and other crud. You may modify undesired path +% filter to your desire. + +% (c) 2020 MathWorks, Inc. +%% Adding folders to path +appStr = 'Adding MATLAB-GBQ-SDK Paths'; +disp(appStr); +disp(repmat('-',1,numel(appStr))); + +%% Set up the paths to be added to the MATLAB path +% This should be the only section of the code that you need to modify +% The second argument specifies whether the given directory should be +% scanned recursively +here = fileparts(mfilename('fullpath')); + +rootDirs={fullfile(here,'app'),true;... + fullfile(here,'lib'),false;... + fullfile(here,'config'),false;... + fullfile(here,'script'),true;... + fullfile(here,'test'),true;... + fullfile(here,'sys','modules'),true;... + fullfile(here,'public'),true;... + }; + +%% Add the framework to the path +iAddFilteredFolders(rootDirs); + +%% Handle the modules for the project. +disp('Initializing all modules'); +modRoot = fullfile(here,'sys','modules'); + +% Get a list of all modules +mList = dir(fullfile(modRoot,'*.')); +for mCount = 1:numel(mList) + % Only add proper folders + dName = mList(mCount).name; + if ~strcmpi(dName(1),'.') + % Valid Module name + candidateStartup = fullfile(modRoot,dName,'startup.m'); + if exist(candidateStartup,'file') + % We have a module with a startup + run(candidateStartup); + else + % Create a cell and add it recursively to the path + iAddFilteredFolders({fullfile(modRoot,dName), true}); + end + end + +end + +%% Find if matlab-gcp-common package is accessible + +% Change directory to GBQ project root under software MATLAB +cd(gbqroot) + +% Get current folder path +f = fileparts(pwd); + +% Constructing relative path to matlab-gcp-common +parts = strsplit(string(f),filesep); +parts_needed = parts(1:end-2); +top_dir = strjoin(parts_needed,filesep); + +% matlab-gcp-common top level directory ../../../matlab-gcp-common +gcp_commons_dir = strcat(top_dir, filesep, 'matlab-gcp-common'); + +% Check if matlab-gcp-common directory exists in the same directory as +% matlab-google-bigquery +if exist(gcp_commons_dir,'dir') + + % Create jar path under Software/MATLAB/lib/jar for matlab-gcp-common + path_to_gcp_jar = strcat(gcp_commons_dir, filesep, 'Software', filesep, 'MATLAB', filesep, 'lib', filesep, 'jar',filesep,'google-gcp-common-sdk-0.1.0.jar'); + + % Look for jar on the path (i.e. is build process complete) + if exist(path_to_gcp_jar,'file') + + % Get current java class path dynamic + jpath = javaclasspath('-dynamic'); + + % Check if jar already exists on path + if ~any(strcmp(jpath,path_to_gcp_jar)) + + % add jar to classpath + javaaddpath(path_to_gcp_jar) + + disp(strcat("google-gcp-common-sdk-0.1.0.jar was not on path. Adding ",string(path_to_gcp_jar)," to the path")); + else + % jar already on class path + disp('google-gcp-common-sdk-0.1.0.jar library exists in path.'); + end + + else + % jar does not exist + disp(strcat(string(path_to_gcp_jar), " cannot be found."," Consider building the jar using maven and the pom.xml file within matlab-gcp-common\Software\Java")); + + end + +else + disp('matlab-gcp-common does not exist at the same directory level as matlab-google-bigquery. Please refer Documentation\Installation.md for instructions regarding package installation and directory structure.'); +end + + +end + +%% iAddFilteredFolders Helper function to add all folders to the path +function iAddFilteredFolders(rootDirs) +% Loop through the paths and add the necessary subfolders to the MATLAB path +for pCount = 1:size(rootDirs,1) + + rootDir=rootDirs{pCount,1}; + if rootDirs{pCount,2} + % recursively add all paths + rawPath=genpath(rootDir); + + if ~isempty(rawPath) + rawPathCell=textscan(rawPath,'%s','delimiter',pathsep); + rawPathCell=rawPathCell{1}; + else + rawPathCell = {rootDir}; + end + + else + % Add only that particular directory + rawPath = rootDir; + rawPathCell = {rawPath}; + end + + % remove undesired paths + svnFilteredPath=strfind(rawPathCell,'.svn'); + gitFilteredPath=strfind(rawPathCell,'.git'); + slprjFilteredPath=strfind(rawPathCell,'slprj'); + sfprjFilteredPath=strfind(rawPathCell,'sfprj'); + rtwFilteredPath=strfind(rawPathCell,'_ert_rtw'); + + % loop through path and remove all the .svn entries + if ~isempty(svnFilteredPath) + for pCount=1:length(svnFilteredPath) %#ok + filterCheck=[svnFilteredPath{pCount},... + gitFilteredPath{pCount},... + slprjFilteredPath{pCount},... + sfprjFilteredPath{pCount},... + rtwFilteredPath{pCount}]; + if isempty(filterCheck) + iSafeAddToPath(rawPathCell{pCount}); + else + % ignore + end + end + else + iSafeAddToPath(rawPathCell{pCount}); + end + +end + +end + +%% Helper function to add to MATLAB path. +function iSafeAddToPath(pathStr) + +% Add to path if the file exists +if exist(pathStr,'dir') + disp(['Adding ',pathStr]); + addpath(pathStr); +else + disp(['Skipping ',pathStr]); +end + +end + diff --git a/Software/MATLAB/test/unit/testbigquery.m b/Software/MATLAB/test/unit/testbigquery.m new file mode 100644 index 0000000..51a731c --- /dev/null +++ b/Software/MATLAB/test/unit/testbigquery.m @@ -0,0 +1,1570 @@ +classdef testbigquery < matlab.unittest.TestCase + % TESTBIGQUERY Unit tests for the big query object + + % (c) 2020 MathWorks, Inc. + properties + logObj + gbqclient + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Please add your test cases below + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (TestMethodSetup) + function testSetup(testCase) + testCase.logObj = Logger.getLogger(); + testCase.logObj.DisplayLevel = 'verbose'; + testCase.gbqclient = gcp.bigquery.BigQuery('credentials.json'); + end + end + + methods (TestMethodTeardown) + function testTearDown(testCase) %#ok<*MANU> + + end + end + + methods (Test) + %% Test @BigQuery + function testBigQuery(testCase) + % Initialization + testCase.gbqclient = gcp.bigquery.BigQuery('credentials.json'); + testCase.assertEqual(class(testCase.gbqclient),'gcp.bigquery.BigQuery'); + end + + function testBigQuerysetLocation(testCase) + %Initialization + gbq = gcp.bigquery.BigQuery('credentials.json'); + testCase.assertEqual(class(gbq),'gcp.bigquery.BigQuery'); + % Call setLocation + gbq = gbq.setLocation('US'); + % Test Object class + testCase.assertEqual(class(gbq),'gcp.bigquery.BigQuery'); + % Test if Location set correctly + testCase.assertEqual(gbq.Location,'US'); + + end + + + %% Test @QueryJobConfiguration, @QueryJobConfiguration.builder, @TableResult, function mattable + function testQuery(testCase) + % Create a client + gbq = testCase.gbqclient; + + % Select a test query + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + + % 1. Use QueryJobConfiguration.Builder to build configuration for + % queries with custom options + + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(true); + % queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(logical(1)); + + % Verify class of the Object + testCase.verifyClass(queryJobConfigurationBuilder,'gcp.bigquery.QueryJobConfiguration.Builder'); + + % Verify class of the Handle + testCase.verifyClass(queryJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.QueryJobConfiguration$Builder'); + + % Build queryJobconfiguration + queryJobConfiguration = queryJobConfigurationBuilder.build(); + + % Verify class of the Object + testCase.verifyClass(queryJobConfiguration,'gcp.bigquery.QueryJobConfiguration'); + + % Verify class of the Handle + testCase.verifyClass(queryJobConfiguration.Handle,'com.google.cloud.bigquery.QueryJobConfiguration'); + + % Make the query and receive TableResult + tableResult = gbq.query(queryJobConfiguration); + + % Check if results are empty + testCase.verifyNotEmpty(tableResult) + + % Verify class of the Object TableResult + testCase.verifyClass(tableResult,'gcp.bigquery.TableResult'); + + % Verify class of the Handle + testCase.verifyClass(tableResult.Handle,'com.google.cloud.bigquery.TableResult'); + + % Get results in a MATLAB table + result_table = gbq2table(tableResult); + + % Verify if empty + testCase.verifyNotEmpty(result_table); + + % Verify height of table + testCase.verifyEqual(height(result_table),40); + + % 2. Use QueryJobConfiguration to set default configuration for queries + + % Build queryJobconfiguration without Builder - use the method + % 'of()' instead + query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;"; + queryJobConfiguration = gcp.bigquery.QueryJobConfiguration.of(query); + + % Verify class of the Object + testCase.verifyClass(queryJobConfiguration,'gcp.bigquery.QueryJobConfiguration'); + + % Verify class of the Handle + testCase.verifyClass(queryJobConfiguration.Handle,'com.google.cloud.bigquery.QueryJobConfiguration'); + + % Make the query + tableResult = gbq.query(queryJobConfiguration); + + % Check if results are empty + testCase.verifyNotEmpty(tableResult) + + % Verify class of the Object + testCase.verifyClass(tableResult,'gcp.bigquery.TableResult'); + + % Verify class of the Handle + testCase.verifyClass(tableResult.Handle,'com.google.cloud.bigquery.TableResult'); + + % Get results in a MATLAB table + result_table = gbq2table(tableResult); + + % Verify if empty + testCase.verifyNotEmpty(result_table); + + end + + %% Test @Dataset, @DatasetId, @DatasetInfo and @BigQuery methods listDatasets, getDataset, deletedataset + function testDataset(testCase) + % Create a client + gbq = testCase.gbqclient; + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Check if results are empty + testCase.verifyNotEmpty(datasetId) + + % Verify class of the Object + testCase.verifyClass(datasetId,'gcp.bigquery.DatasetId'); + + % Verify class of the Handle + testCase.verifyClass(datasetId.Handle,'com.google.cloud.bigquery.DatasetId'); + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(datasetname); + + % Check if results are empty + testCase.verifyNotEmpty(datasetId) + + % Verify class of the Object + testCase.verifyClass(datasetId,'gcp.bigquery.DatasetId'); + + % Verify class of the Handle + testCase.verifyClass(datasetId.Handle,'com.google.cloud.bigquery.DatasetId'); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + + % Check if results are empty + testCase.verifyNotEmpty(datasetInfo) + + % Verify class of the Object + testCase.verifyClass(datasetInfo,'gcp.bigquery.DatasetInfo'); + + % Verify class of the Handle + testCase.verifyClass(datasetInfo.Handle,'com.google.cloud.bigquery.DatasetInfo'); + + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + + % Check if results are empty + testCase.verifyNotEmpty(datasetField) + + % Verify class of the Object + testCase.verifyClass(datasetField,'gcp.bigquery.BigQuery.DatasetField'); + + % Verify class of the Handle + testCase.verifyClass(datasetField.Handle,'com.google.cloud.bigquery.BigQuery$DatasetField[]'); + + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + + % Check if results are empty + testCase.verifyNotEmpty(datasetOption) + + % Verify class of the Object + testCase.verifyClass(datasetOption,'gcp.bigquery.BigQuery.DatasetOption'); + + % Verify class of the Handle + testCase.verifyClass(datasetOption.Handle,'com.google.cloud.bigquery.BigQuery$DatasetOption'); + + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % Check if results are empty + testCase.verifyNotEmpty(dataSet) + + % Verify class of the Object + testCase.verifyClass(dataSet,'gcp.bigquery.Dataset'); + + % Verify class of the Handle + testCase.verifyClass(dataSet.Handle,'com.google.cloud.bigquery.Dataset'); + + % delete the variable dataSet in workspace to test Dataset + % related methods + clear dataSet; + + % test list datasets + + % Create datasetlistOption + datasetListOption1 = gcp.bigquery.BigQuery.DatasetListOption.all; + % datasetListOption2 = gcp.bigquery.BigQuery.DatasetListOption.labelFilter(datasetname); + datasetListOption3 = gcp.bigquery.BigQuery.DatasetListOption.pageSize(10); + + % List datasets with different option combination + list1 = gbq.listDatasets(datasetListOption1); + % list2 = gbq.listDatasets(datasetListOption2,datasetListOption3) + list3 = gbq.listDatasets(datasetListOption1,datasetListOption3); + + % Check if dataset exists in the list + + % getting dataset ids into an array from the above lists list1 + % and list3 + % list 2 is not in use since addlabels to dataset is not a + % current feature + datasetidarr1 = list1{:,1}; + datasetidarr3 = list3{:,1}; + + % test if dataset created above exists in the list1 of + % datasetids + tf = any(strcmp(datasetidarr1,datasetname)); + + % Verify if true + testCase.verifyTrue(tf); + + % test if dataset created above exists in the list3 of + % datasetids + tf = any(strcmp(datasetidarr3,datasetname)); + + % Verify if true + testCase.verifyTrue(tf); + + % Get dataset handle + testdataSet = gbq.getDataset(datasetname); + + % Delete this experimental dataset + tf = gbq.deleteDataset(datasetname); + + %Verify dataset deletion + testCase.verifyTrue(tf); + + % Check if dataset still exists + tf = testdataSet.exists(); + + %Verify dataset does not exist as deleted above + testCase.verifyFalse(tf); + + + end + + %% Testing JobId.Builder + function testJobIdBuilder(testCase) + %Initialization + gbq = gcp.bigquery.BigQuery('credentials.json'); + location = 'EU'; + project = gbq.ProjectId; + jb = gcp.bigquery.JobId.newBuilder; + jb = jb.setRandomJob(); + jb = jb.setLocation(location); + jb = jb.setProject(project); + jobId = jb.build; + testCase.verifyClass(jobId,'gcp.bigquery.JobId'); + end + %% Test @JobInfo, @JobId, @Job, @JobField, @JobOption, @TableResult, @Table.extract(), @JobListOption, bigquery.listJobs() + function testJob(testCase) + % Create a client + gbq = testCase.gbqclient; + + %% Creating options with which Job should be created + + % Create Job Field + jobField = gcp.bigquery.BigQuery.JobField.values; + + % Check if results are empty + testCase.verifyNotEmpty(jobField) + + % Verify class of the Object + testCase.verifyClass(jobField,'gcp.bigquery.BigQuery.JobField'); + + % Verify class of the Handle + testCase.verifyClass(jobField.Handle,'com.google.cloud.bigquery.BigQuery$JobField[]'); + + % Create Job Field + jobField = gcp.bigquery.BigQuery.JobField.valueOf('ID','STATUS'); + + % Check if results are empty + testCase.verifyNotEmpty(jobField) + + % Verify class of the Object + testCase.verifyClass(jobField,'gcp.bigquery.BigQuery.JobField'); + + % Verify class of the Handle + testCase.verifyClass(jobField.Handle,'com.google.cloud.bigquery.BigQuery$JobField[]'); + + % Create Job Creating Option + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + + % Check if results are empty + testCase.verifyNotEmpty(jobOptions) + + % Verify class of the Object + testCase.verifyClass(jobOptions,'gcp.bigquery.BigQuery.JobOption'); + + % Verify class of the Handle + testCase.verifyClass(jobOptions.Handle,'com.google.cloud.bigquery.BigQuery$JobOption'); + + % Creating Job Id + randomJobId = gcp.bigquery.JobId.createJobId(); + + % Check if results are empty + testCase.verifyNotEmpty(randomJobId) + + % Verify class of the Object + testCase.verifyClass(randomJobId,'char'); + + % Create a JobId Object using the random jobid created above + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); + + % Check if results are empty + testCase.verifyNotEmpty(jobId) + + % Verify class of the Object + testCase.verifyClass(jobId,'gcp.bigquery.JobId'); + + % Verify class of the Handle + testCase.verifyClass(jobId.Handle,'com.google.cloud.bigquery.AutoValue_JobId'); + + % Setting properties such as QueryJobconfiguration and JobId for the object JobInfo + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(true); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(true); + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + % Create a datasetId + projectid = gbq.ProjectId; + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % Set destination dataset and table + tableId = gcp.bigquery.TableId.of(datasetname,'newtable1'); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setDestinationTable(tableId); + queryJobConfiguration = queryJobConfigurationBuilder.build; + + % Create JobInfo for the destination table and dataset + jobInfobuilder = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration); + jobInfobuilder = jobInfobuilder.setJobId(jobId); + jobInfo = jobInfobuilder.build; + % Check if results are empty + testCase.verifyNotEmpty(jobInfo) + + % Verify class of the Object + testCase.verifyClass(jobInfo,'gcp.bigquery.JobInfo'); + + % Verify class of the Handle + testCase.verifyClass(jobInfo.Handle,'com.google.cloud.bigquery.JobInfo'); + + % Job creation + job = gbq.create(jobInfo,jobOptions); + + % Check if results are empty + testCase.verifyNotEmpty(job) + + % Verify class of the Object + testCase.verifyClass(job,'gcp.bigquery.Job'); + + % Verify class of the Handle + testCase.verifyClass(job.Handle,'com.google.cloud.bigquery.Job'); + + % Polling for job completion + job.waitFor + + % Setting options for the way you would want query results to be returned + queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + + % Check if results are empty + testCase.verifyNotEmpty(queryResultsOption) + + % Verify class of the Object + testCase.verifyClass(queryResultsOption,'gcp.bigquery.BigQuery.QueryResultsOption'); + + % Verify class of the Handle + testCase.verifyClass(queryResultsOption.Handle,'com.google.cloud.bigquery.BigQuery$QueryResultsOption'); + + % Receiving query results as object TableResult + tableResult = job.getQueryResults(queryResultsOption); + + % Check if results are empty + testCase.verifyNotEmpty(tableResult) + + % Verify class of the Object + testCase.verifyClass(tableResult,'gcp.bigquery.TableResult'); + + % Verify class of the Handle + testCase.verifyClass(tableResult.Handle,'com.google.cloud.bigquery.TableResult'); + + % Get results in a MATLAB table + result_table = gbq2table(tableResult); + + % Verify if empty + testCase.verifyNotEmpty(result_table); + + % Verify height of table + testCase.verifyEqual(height(result_table),40); + + % Extract data from destination table to a Google Cloud storage + % bucket + + % Setting gcs paths + f = fileparts(pwd); parts = strsplit(string(f),filesep); parts_needed = parts(1:end-4); + top_dir = strjoin(parts_needed,filesep); + gcspath = strcat(top_dir, filesep, 'matlab-google-cloud-storage',filesep,'Software', filesep, 'MATLAB', filesep, 'startup.m'); + run(gcspath); + + % Create an example bucket and blob for receiving table data + + % Create gcs client + gcstorage = gcp.storage.Storage(); + + % Cloud Storage requires a unique bucket name globally + uniquebucketname = [gcstorage.projectId 'testgbqbucketjson1' ]; + + % Create bucketInfo and bucketTargetOptions since they are required for + % bucket creation by Google Cloud Storage API + bucketInfo = gcp.storage.BucketInfo.of(uniquebucketname); + bucketTargetOption = gcp.storage.Storage.BucketTargetOption.userProject(gcstorage.projectId); + + % Creating bucket + bucket = gcstorage.create(bucketInfo, bucketTargetOption); + + % Extract the results from Job to the Cloud Storage bucket + % Here you can also replace bucket.bucketname with a string represneting an + % existing bucket name that you might have + % To query list of buckets that you might have in a project refer >> help gcp.storage.Storage.list + bucketName = char(bucket.bucketName); % unique bucket name (can be different than the project Id) + fileName = "tableresult.csv"; + + % Extract results as a bulk from Cloud Storage to a local path + gbqtable = gbq.getTable(datasetname,'newtable1'); + + % Verify class of gbqtable + testCase.verifyClass(gbqtable,'gcp.bigquery.Table') + + % Verify class of the Handle object + testCase.verifyClass(gbqtable.Handle,'com.google.cloud.bigquery.Table'); + + % Extract destination table results to a Google cloud storage + % blob (in this case a csv file provided in variable filename + % blob is always contained within a Google cloud Storage bucket + % In this case bucket's name is int bucketName variable + gbqtable.extract(fileName,bucketName); + + % create blobfield and bloboption to get access to the remote + % blob using get() method on storage client + blobfields = gcp.storage.Storage.BlobField; + blobGetOption = gcp.storage.Storage.BlobGetOption.fields(blobfields); + blob = gcstorage.get(bucketName,fileName,blobGetOption); + + % Using default temporary directory for downloading blob + % content. In this case it will be the csv file + downloadLocation = tempdir; + + % Download blob content to tempdir location + blob.downloadTo(downloadLocation); + + % Verify if file exists on the specified path + % 'downloadLocation' + tf = isfile(char(strcat(downloadLocation,blob.name))); + testCase.verifyTrue(tf); + + % Inject delay to avoid incomplete downloads + pause(1) + + % Clearing local file after test completion + delete(char(strcat(downloadLocation,blob.name))) + + %% List Jobs gbq.listJobs() JobListOption + % create job listoption + jobListOption1 = gcp.bigquery.BigQuery.JobListOption.pageSize(100); + % verify class + testCase.verifyClass(jobListOption1,'gcp.bigquery.BigQuery.JobListOption'); + % list jobs for this project + jobList = gbq.listJobs(jobListOption1); + + %% Delete the blob after test + + write(testCase.logObj,'debug','Testing Blob Deletion method storage.delete\n'); + + % Create BlobId + blobId = gcp.storage.BlobId.of(bucket.bucketName,blob.name); + + % Delete Test Blob to empty Test Bucket + tf = gcstorage.deleteObject(blobId); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + + %% Delete the bucket after test + write(testCase.logObj,'debug','Testing Bucket Deletion method storage.deleteObject\n'); + + % Create BucketSourceOption object to help bucket deletion + bucketSourceOption = gcp.storage.Storage.BucketSourceOption.userProject(gcstorage.projectId); + + % Delete Test Bucket + tf = gcstorage.deleteObject(bucket.bucketName, bucketSourceOption); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + + %% Delete Table + + % Delete the Table object + tf = gbq.deleteTable(tableId); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + + % Verify if table still exists + tf = gbqtable.exists(); + % Verify this is false + testCase.verifyFalse(tf); + %% Delete Dataset + + tf = gbq.deleteDataset(datasetname); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + end + + %% Test @BigQuery methods listTables getTables and @Table methods delete and exists + function testTable(testCase) + % Create a client + gbq = testCase.gbqclient; + + % Creating options with which Job should be created + + % Create Job Field + jobField = gcp.bigquery.BigQuery.JobField.values; + + % Create Job Creating Option + jobOptions = gcp.bigquery.BigQuery.JobOption.fields(jobField); + + % Creating Job Id + randomJobId = gcp.bigquery.JobId.createJobId(); + + % Create a JobId Object using the random jobid created above + jobId = gcp.bigquery.JobId.of(gbq.ProjectId,randomJobId); + + % Setting properties such as QueryJobconfiguration and JobId for the object JobInfo + query = "SELECT title, comment, contributor_ip, timestamp, num_characters FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 40;"; + queryJobConfigurationBuilder = gcp.bigquery.QueryJobConfiguration.newBuilder(query); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setUseLegacySql(true); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setAllowLargeResults(true); + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + projectid = gbq.ProjectId; + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % Set destination dataset and table + tableId = gcp.bigquery.TableId.of(datasetname,'newtable1'); + queryJobConfigurationBuilder = queryJobConfigurationBuilder.setDestinationTable(tableId); + queryJobConfiguration = queryJobConfigurationBuilder.build; + + % Create JobInfo for the destination table and dataset + jobInfobuilder = gcp.bigquery.JobInfo.newBuilder(queryJobConfiguration); + jobInfobuilder = jobInfobuilder.setJobId(jobId); + jobInfo = jobInfobuilder.build; + + % Job creation + job = gbq.create(jobInfo,jobOptions); + + % Polling for job completion + job.waitFor + + % Setting options for the way you would want query results to be returned + queryResultsOption = gcp.bigquery.BigQuery.QueryResultsOption.pageSize(100); + + % Receiving query results as object TableResult + job.getQueryResults(queryResultsOption); + + % Testing listTables, TableId, Table, + % Table.exists(),Table.delete() + + % List tables + tableList = gbq.listTables(datasetname); + tableidarr = tableList{:,2}; + + % Check if created destination table exists + + % test if table created above exists in the list of + % tableids + tf = any(strcmp(tableidarr,'newtable1')); + + % Verify if true + testCase.verifyTrue(tf); + + % Get Handle for table object + gbqTable = gbq.getTable(datasetname,'newtable1'); + + % Verify Class + testCase.verifyClass(gbqTable,'gcp.bigquery.Table'); + + % Verify Class Handle + testCase.verifyClass(gbqTable.Handle,'com.google.cloud.bigquery.Table'); + + % Create TableId + tableId = gcp.bigquery.TableId.of(datasetname,'newtable1'); + + % Verify TableId is not an empty object + testCase.verifyNotEmpty(tableId); + + % Verify class + testCase.verifyClass(tableId,'gcp.bigquery.TableId'); + + % Verify Handle + testCase.verifyClass(tableId.Handle,'com.google.cloud.bigquery.TableId'); + + %% Delete Table + + % Delete the Table object + tf = gbq.deleteTable(tableId); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + + % Verify if table still exists + tf = gbqTable.exists(); + + % Verify this is false + testCase.verifyFalse(tf); + %% Delete Dataset + + tf = gbq.deleteDataset(datasetname); + + % Verify if successfully deleted + testCase.verifyTrue(tf); + + end + + %% Test @FormatOptions + function testFormatOption(testCase) + + % Create a csv format options + csvformatOptions = gcp.bigquery.FormatOptions.csv; + + % Verifying class of object + testCase.verifyClass(csvformatOptions,'gcp.bigquery.FormatOptions'); + + % Verifying class Handle + testCase.verifyClass(csvformatOptions.Handle,'com.google.cloud.bigquery.CsvOptions'); + + % Create an avro format options + avroformatOptions = gcp.bigquery.FormatOptions.avro; + + % Verifying class of object + testCase.verifyClass(avroformatOptions,'gcp.bigquery.FormatOptions'); + + % Verifying class Handle + testCase.verifyClass(avroformatOptions.Handle,'com.google.cloud.bigquery.FormatOptions'); + + % Create a json format options + jsonformatOptions = gcp.bigquery.FormatOptions.json; + + % Verifying class of object + testCase.verifyClass(jsonformatOptions,'gcp.bigquery.FormatOptions'); + + % Verifying class Handle + testCase.verifyClass(jsonformatOptions.Handle,'com.google.cloud.bigquery.FormatOptions'); + + % Create a orc format options + orcformatOptions = gcp.bigquery.FormatOptions.orc; + + % Verifying class of object + testCase.verifyClass(orcformatOptions,'gcp.bigquery.FormatOptions'); + + % Verifying class Handle + testCase.verifyClass(orcformatOptions.Handle,'com.google.cloud.bigquery.FormatOptions'); + + % Create a parquet format options + parquetformatOptions = gcp.bigquery.FormatOptions.parquet; + + % Verifying class of object + testCase.verifyClass(parquetformatOptions,'gcp.bigquery.FormatOptions'); + + % Verifying class Handle + testCase.verifyClass(parquetformatOptions.Handle,'com.google.cloud.bigquery.FormatOptions'); + end + + %% Test +JobInfo/@CreateDisposition and +JobInfo/@WriteDisposition + function testCreateandWriteDisposition(testCase) + + %% Enum Constant and Description for @CreateDisposition + % --------------------------------------------------- + % * CREATE_IF_NEEDED : Configures the job to create the table if it does not exist. + % + % * CREATE_NEVER : Configures the job to fail with a not-found error if the table does not exist. + + createDispositionEnum = 'CREATE_IF_NEEDED'; + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createDispositionEnum); + + % Verifying class of object + testCase.verifyClass(createDispositionConfig,'gcp.bigquery.JobInfo.CreateDisposition'); + + % Verifying class Handle + testCase.verifyClass(createDispositionConfig.Handle,'com.google.cloud.bigquery.JobInfo$CreateDisposition'); + + createDispositionEnum = 'CREATE_NEVER'; + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createDispositionEnum); + + % Verifying class of object + testCase.verifyClass(createDispositionConfig,'gcp.bigquery.JobInfo.CreateDisposition'); + + % Verifying class Handle + testCase.verifyClass(createDispositionConfig.Handle,'com.google.cloud.bigquery.JobInfo$CreateDisposition'); + + %% Enum Constant and Description for WriteDisposition + % -------------------------------------------------- + % * WRITE_APPEND : Configures the job to append data to the table if it already exists. + % + % * WRITE_EMPTY : Configures the job to fail with a duplicate error if the table already exists. + % + % * WRITE_TRUNCATE : Configures the job to overwrite the table data if table already exists. + + writeDispositionEnum = 'WRITE_APPEND'; + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); + + % Verifying class of object + testCase.verifyClass(writeDispositionConfig,'gcp.bigquery.JobInfo.WriteDisposition'); + + % Verifying class Handle + testCase.verifyClass(writeDispositionConfig.Handle,'com.google.cloud.bigquery.JobInfo$WriteDisposition'); + + writeDispositionEnum = 'WRITE_EMPTY'; + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); + + % Verifying class of object + testCase.verifyClass(writeDispositionConfig,'gcp.bigquery.JobInfo.WriteDisposition'); + + % Verifying class Handle + testCase.verifyClass(writeDispositionConfig.Handle,'com.google.cloud.bigquery.JobInfo$WriteDisposition'); + + writeDispositionEnum = 'WRITE_TRUNCATE'; + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); + + % Verifying class of object + testCase.verifyClass(writeDispositionConfig,'gcp.bigquery.JobInfo.WriteDisposition'); + + % Verifying class Handle + testCase.verifyClass(writeDispositionConfig.Handle,'com.google.cloud.bigquery.JobInfo$WriteDisposition'); + end + + %% Test @LoadJobConfiguration and +LoadJobConfiguration/@Builder + function testLoadJobConfiguration(testCase) + %% Test methods from @LoadJobConfiguration + % LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(tableId,sourceUri); + % LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,sourceUri); + % LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(tableId,sourceUri,formatOptions); + % LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(tableId,sourceUri); + % LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(tableId,sourceUri,formatOptions); + + % Requirements: + % * tableId + % * sourceUri + % * formatOptions + + %% Creating dataset and TableId + % Create a client + gbq = testCase.gbqclient; + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % TableId for destination tables + csvtableId = gcp.bigquery.TableId.of(datasetname,'csvnewtable'); + parquettableId = gcp.bigquery.TableId.of(datasetname,'parquetnewtable'); + jsontableId = gcp.bigquery.TableId.of(datasetname,'jsonnewtable'); + %avrotableId = gcp.bigquery.TableId.of(datasetname,'avronewtable'); + %orctableId = gcp.bigquery.TableId.of(datasetname,'orcnewtable'); + + %% Creating sourceuri for different GCS blobs + % Setting gcs paths + f = fileparts(pwd); parts = strsplit(string(f),filesep); parts_needed = parts(1:end-4); + top_dir = strjoin(parts_needed,filesep); + gcspath = strcat(top_dir, filesep, 'matlab-google-cloud-storage',filesep,'Software', filesep, 'MATLAB', filesep, 'startup.m'); + run(gcspath); + + % Create an example bucket and blob for receiving table data + + % Create gcs client + gcstorage = gcp.storage.Storage(); + + % Cloud Storage requires a unique bucket name globally + uniquebucketname = [gcstorage.projectId 'testgbqbucketjson1' ]; + + % Create bucketInfo and bucketTargetOptions since they are required for + % bucket creation by Google Cloud Storage API + bucketInfo = gcp.storage.BucketInfo.of(uniquebucketname); + bucketTargetOption = gcp.storage.Storage.BucketTargetOption.userProject(gcstorage.projectId); + + % Creating bucket + bucket = gcstorage.create(bucketInfo, bucketTargetOption); + + % Create blob + csvblob = bucket.create("airlinesmall.csv","airlinesmall.csv"); + parquetblob = bucket.create("outages.parquet","outages.parquet"); + jsonblob = bucket.create("states.json","states.json"); + + csvsourceUri = strcat("gs://", uniquebucketname, '/', csvblob.name); + parquetsourceUri = strcat("gs://", uniquebucketname, '/', parquetblob.name); + jsonsourceUri = strcat("gs://", uniquebucketname, '/', jsonblob.name); + + %% formatOptions + csvformatOptions = gcp.bigquery.FormatOptions.csv; + parquetformatOptions = gcp.bigquery.FormatOptions.parquet; + jsonformatOptions = gcp.bigquery.FormatOptions.json; + + %% Testing methods for @Loadconfiguration now + + fprintf("\nTesting methods for @Loadconfiguration now\n"); + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(csvtableId,csvsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(parquettableId,parquetsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.builder(jsontableId,jsonsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(csvtableId,csvsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(parquettableId,parquetsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(jsontableId,jsonsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(csvtableId,csvsourceUri,csvformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(parquettableId,parquetsourceUri,parquetformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = gcp.bigquery.LoadJobConfiguration.newBuilder(jsontableId,jsonsourceUri,jsonformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(csvtableId,csvsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(parquettableId,parquetsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + LoadJobConfiguration= gcp.bigquery.LoadJobConfiguration.of(jsontableId,jsonsourceUri); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(csvtableId,csvsourceUri,csvformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(parquettableId,parquetsourceUri,parquetformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + LoadJobConfiguration = gcp.bigquery.LoadJobConfiguration.of(jsontableId,jsonsourceUri,jsonformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + fprintf("\nTesting methods for @Loadconfiguration complete\n"); + + %% Testing methods from +LoadJobConfiguration/@Builder + fprintf("\nTesting methods for @Loadconfiguration.Builder now\n"); + + %% test setAutodetect() + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setAutodetect(java.lang.Boolean(0)); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + %% test setdestinationTableId() + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setDestinationTable(csvtableId); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + %% test setformatoptions() + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setFormatOptions(csvformatOptions); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + %% test createdisposition() + createDispositionEnum = 'CREATE_IF_NEEDED'; + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createDispositionEnum); + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setCreateDisposition(createDispositionConfig); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + %% test setwritedisposition() + writeDispositionEnum = 'WRITE_APPEND'; + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); + LoadJobConfigurationBuilder = LoadJobConfigurationBuilder.setWriteDisposition(writeDispositionConfig); + + % Verify object class + testCase.verifyClass(LoadJobConfigurationBuilder,'gcp.bigquery.LoadJobConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfigurationBuilder.Handle,'com.google.cloud.bigquery.LoadJobConfiguration$Builder'); + + %% test build() + LoadJobConfiguration = LoadJobConfigurationBuilder.build; + + % Verify object class + testCase.verifyClass(LoadJobConfiguration,'gcp.bigquery.LoadJobConfiguration'); + + % Verify Handle class + testCase.verifyClass(LoadJobConfiguration.Handle,'com.google.cloud.bigquery.LoadJobConfiguration'); + + fprintf("\nTesting methods for @Loadconfiguration.Builder complete\n"); + + %% Clean up resources + % * GCS Blob files + % * GCS Bucket + % * GBQ Dataset + + % Cleaning up blobs + blobSourceOption = gcp.storage.Blob.BlobSourceOption.generationMatch; + + tf = csvblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + tf = parquetblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + tf = jsonblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + fprintf("\nAll blobs deleted\n"); + + % Cleaning up bucket + bucketSourceOption = gcp.storage.Bucket.BucketSourceOption.metagenerationMatch; + + tf = bucket.delete(bucketSourceOption); + testCase.verifyTrue(tf); + + fprintf("\nBucket deleted\n"); + + % Delete dataset + tf = gbq.deleteDataset(datasetname); + testCase.verifyTrue(tf); + fprintf("\nDataset deleted\n"); + + fprintf("Completed testing LoadJobconfiguration and its builder methods "); + + end + + %% Test @WriteChannelConfiguration and +WriteChannelConfiguration/@Builder + function testWriteChannelConfiguration(testCase) + + % Supported methods within @WriteChannelConfiguration + % + % writeChannelConfigurationBuilder = WriteChannelConfiguration.gcp.bigquery.WriteChannelConfiguration.newBuilder(TableId) + % writeChannelConfigurationBuilder WriteChannelConfiguration.newBuilder(TableId,FormatOptions) + % writeChannelConfiguration = WriteChannelConfiguration.of(TableId) + % writeChannelConfiguration = WriteChannelConfiguration.of(TableId ,FormatOptions) + % + % Testing requirements + % * test dataset + % * test tableId + % * formatoptions + + %% Creating dataset and TableId + % Create a client + gbq = testCase.gbqclient; + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % TableId for destination tables + tableId = gcp.bigquery.TableId.of(datasetname,'csvnewtable'); + + %% formatOptions + formatOptions = gcp.bigquery.FormatOptions.csv; + + %% Testing methods for @WriteChannelConfiguration now + writeChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.newBuilder(tableId); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + writeChannelConfigurationBuilder = gcp.bigquery.WriteChannelConfiguration.newBuilder(tableId,formatOptions); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + writeChannelConfiguration= gcp.bigquery.WriteChannelConfiguration.of(tableId); + + % Verify object class + testCase.verifyClass(writeChannelConfiguration,'gcp.bigquery.WriteChannelConfiguration'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfiguration.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration'); + + writeChannelConfiguration = gcp.bigquery.WriteChannelConfiguration.of(tableId ,formatOptions); + % Verify object class + testCase.verifyClass(writeChannelConfiguration,'gcp.bigquery.WriteChannelConfiguration'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfiguration.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration'); + + fprintf("\nTesting methods for @WriteChannelConfiguration complete\n"); + + %% Testing methods from +LoadJobConfiguration/@Builder + fprintf("\nTesting methods for WriteChannelConfiguration.Builder now\n"); + + %% testing AutoDetect + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setAutodetect(java.lang.Boolean(0)); + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setAutodetect(java.lang.Boolean(1)); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + %% testing setDestinationTable + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setDestinationTable(tableId); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + %% testing setFormatOptions + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setFormatOptions(formatOptions); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + %% testing setWriteDisposition + writeDispositionEnum = 'WRITE_APPEND'; + writeDispositionConfig = gcp.bigquery.JobInfo.WriteDisposition.valueOf(writeDispositionEnum); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setWriteDisposition(writeDispositionConfig); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + %% testing setCreateDisposition + createDispositionEnum = 'CREATE_IF_NEEDED'; + createDispositionConfig = gcp.bigquery.JobInfo.CreateDisposition.valueOf(createDispositionEnum); + writeChannelConfigurationBuilder = writeChannelConfigurationBuilder.setCreateDisposition(createDispositionConfig); + + % Verify object class + testCase.verifyClass(writeChannelConfigurationBuilder,'gcp.bigquery.WriteChannelConfiguration.Builder'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfigurationBuilder.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration$Builder'); + + %% testing build() + writeChannelConfiguration = writeChannelConfigurationBuilder.build; + + % Verify object class + testCase.verifyClass(writeChannelConfiguration,'gcp.bigquery.WriteChannelConfiguration'); + + % Verify Handle class + testCase.verifyClass(writeChannelConfiguration.Handle,'com.google.cloud.bigquery.WriteChannelConfiguration'); + + %% Cleaning Resources + % * GBQ dataset + + % Delete dataset + tf = gbq.deleteDataset(datasetname); + testCase.verifyTrue(tf); + fprintf("\nDataset deleted\n"); + fprintf("\nTesting methods for @WriteChannelConfiguration.Builder complete\n"); + end + + %% Test function copyfiletobigquery + function testCopyFileToBigquery(testCase) + + % Testing function for Loading data into BigQuery Table with local file + + %% Creating dataset and TableId + % Create a client + gbq = testCase.gbqclient; + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % TableId for destination tables + csvtableId = gcp.bigquery.TableId.of(datasetname,'csvnewtable'); + parquettableId = gcp.bigquery.TableId.of(datasetname,'parquetnewtable'); + jsontableId = gcp.bigquery.TableId.of(datasetname,'jsonnewtable'); + %avrotableId = gcp.bigquery.TableId.of(datasetname,'avronewtable'); + %orctableId = gcp.bigquery.TableId.of(datasetname,'orcnewtable'); + + % creating table first time + filename = 'airlinesmall_1.csv'; + createdisposition = 'CREATE_NEVER'; + writedisposition = 'WRITE_TRUNCATE'; + % Should fail since table does not exist and create disposition + % is set to CREATE_NEVER + try + copyfiletobigquery(gbq,datasetname,char(csvtableId.Handle.getTable),filename,createdisposition,writedisposition); + catch + fprintf("\ncorrectly errored out when disposition was 'CREATE_NEVER'\n"); + end + + % Switching disposition to create a table if needed + createdisposition = 'CREATE_IF_NEEDED'; + copyfiletobigquery(gbq,datasetname,char(csvtableId.Handle.getTable),filename,createdisposition,writedisposition); + + fprintf("\ncopied csv file to gbq table successfully\n"); + fprintf("\nCreate disposition was 'CREATE_IF_NEEDED'\n"); + + % Should give us an error since write_disposition is WRITE_EMPTY + filename = 'airlinesmall_2.csv'; + writedisposition = 'WRITE_EMPTY'; + try + copyfiletobigquery(gbq,datasetname,char(csvtableId.Handle.getTable),filename,createdisposition,writedisposition); + catch + fprintf("\ncorrectly errored out when disposition was 'WRITE_EMPTY'\n"); + end + + % Should successfully append to existing table when disposition is 'WRITE_APPEND' + writedisposition = 'WRITE_APPEND'; + copyfiletobigquery(gbq,datasetname,char(csvtableId.Handle.getTable),filename,createdisposition,writedisposition); + + fprintf("\ncorrectly appended when disposition was 'WRITE_APPEND'\n"); + + % Test for parquet copy + filename = 'outages.parquet'; + copyfiletobigquery(gbq,datasetname,char(parquettableId.Handle.getTable),filename,createdisposition,writedisposition); + + fprintf("\ncopied parquet file to gbq table successfully\n"); + + % Test for json copy + filename = 'states.json'; + copyfiletobigquery(gbq,datasetname,char(jsontableId.Handle.getTable),filename,createdisposition,writedisposition); + + fprintf("\ncopied newline json file to gbq table successfully\n"); + + %% Cleaning up resources + % Cleaning GBQ tables + % Cleaning dataset + + % Get handles to tables + + tf = gbq.deleteTable(csvtableId); + testCase.verifyTrue(tf); + + tf = gbq.deleteTable(parquettableId); + testCase.verifyTrue(tf); + + tf = gbq.deleteTable(jsontableId); + testCase.verifyTrue(tf); + + fprintf(strcat("\nAll GBQ tables deleted from dataset",datasetname,"\n")); + + % Delete dataset + tf = gbq.deleteDataset(datasetname); + testCase.verifyTrue(tf); + fprintf("\nDataset deleted\n"); + + fprintf("\nCompleted testing copyfiletogbqtable\n"); + end + + %% Test function GCStoGBQtable + function testLoadGCStoBigQuery(testCase) + % Testing function for Loading data into BigQuery Table with local file + + %% Creating dataset and TableId + % Create a client + gbq = testCase.gbqclient; + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields for listing + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); + + % TableId for destination tables + csvtableId = gcp.bigquery.TableId.of(datasetname,'csvnewtable'); + parquettableId = gcp.bigquery.TableId.of(datasetname,'parquetnewtable'); + jsontableId = gcp.bigquery.TableId.of(datasetname,'jsonnewtable'); + %avrotableId = gcp.bigquery.TableId.of(datasetname,'avronewtable'); + %orctableId = gcp.bigquery.TableId.of(datasetname,'orcnewtable'); + + % Setting gcs paths + f = fileparts(pwd); parts = strsplit(string(f),filesep); parts_needed = parts(1:end-4); + top_dir = strjoin(parts_needed,filesep); + gcspath = strcat(top_dir, filesep, 'matlab-google-cloud-storage',filesep,'Software', filesep, 'MATLAB', filesep, 'startup.m'); + run(gcspath); + + % Create an example bucket and blob for loading gbq table for + % testing + + % Create gcs client + gcstorage = gcp.storage.Storage(); + + % Cloud Storage requires a unique bucket name globally + uniquebucketname = [gcstorage.projectId 'testgbqbucketjson1' ]; + + % Create bucketInfo and bucketTargetOptions since they are required for + % bucket creation by Google Cloud Storage API + bucketInfo = gcp.storage.BucketInfo.of(uniquebucketname); + bucketTargetOption = gcp.storage.Storage.BucketTargetOption.userProject(gcstorage.projectId); + + % Creating bucket + bucket = gcstorage.create(bucketInfo, bucketTargetOption); + + % Create blob + csvblob = bucket.create("airlinesmall.csv","airlinesmall.csv"); + parquetblob = bucket.create("outages.parquet","outages.parquet"); + jsonblob = bucket.create("states.json","states.json"); + + % Create source uri not required + csvsourceUri = strcat("gs://", uniquebucketname, '/', csvblob.name); + parquetsourceUri = strcat("gs://", uniquebucketname, '/', parquetblob.name); + jsonsourceUri = strcat("gs://", uniquebucketname, '/', jsonblob.name); + + createdisposition = 'CREATE_IF_NEEDED'; + writedisposition = 'WRITE_APPEND'; + + % writing csv blob + gcstogbqtable(gbq,datasetname,char(csvtableId.Handle.getTable),bucket.bucketName,csvblob.name,createdisposition,writedisposition); + + fprintf(strcat("\n\nSuccessfully loaded ","table '", string(csvtableId.Handle.getTable),"' with ", csvsourceUri,"\n")); + + % writing parquet blob + gcstogbqtable(gbq,datasetname,char(parquettableId.Handle.getTable),bucket.bucketName,parquetblob.name,createdisposition,writedisposition); + + fprintf(strcat("\n\nSuccessfully loaded ","table '", string(parquettableId.Handle.getTable),"' with ", parquetsourceUri)); + + % writing json blob + gcstogbqtable(gbq,datasetname,char(jsontableId.Handle.getTable),bucket.bucketName,jsonblob.name,createdisposition,writedisposition); + + fprintf(strcat("\n\nSuccessfully loaded ","table '", string(jsontableId.Handle.getTable),"' with ", jsonsourceUri)); + + %% Clean up resources + % * GCS Blob files + % * GCS Bucket + % * GBQ Tables + % * GBQ Dataset + + % Cleaning up blobs + blobSourceOption = gcp.storage.Blob.BlobSourceOption.generationMatch; + + tf = csvblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + tf = parquetblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + tf = jsonblob.delete(blobSourceOption); + testCase.verifyTrue(tf); + + fprintf("\n\nAll blobs deleted"); + + % Cleaning up bucket + bucketSourceOption = gcp.storage.Bucket.BucketSourceOption.metagenerationMatch; + + tf = bucket.delete(bucketSourceOption); + testCase.verifyTrue(tf); + + fprintf("\n\nBucket deleted"); + + % Get handles to tables and delete + tf = gbq.deleteTable(csvtableId); + testCase.verifyTrue(tf); + + tf = gbq.deleteTable(parquettableId); + testCase.verifyTrue(tf); + + tf = gbq.deleteTable(jsontableId); + testCase.verifyTrue(tf); + + fprintf(strcat("\n\nAll GBQ tables deleted from dataset ",datasetname)); + + % Delete dataset + tf = gbq.deleteDataset(datasetname); + testCase.verifyTrue(tf); + fprintf("\n\nDataset deleted"); + + fprintf("\nCompleted testing gcstogbqtable function "); + end + + + %% Test @StandardTableDefinition and +StandardTableDefinition /@Builder, bigquery.create(), TableField.valueOf() + function teststandardTableDefinition(testCase) + % Create a client + gbq = testCase.gbqclient; + + % Create StandardTableDefinition Builder + StandardTableDefinitionBuilder = gcp.bigquery.StandardTableDefinition.newBuilder(); + + % Create StandardTableDefinition + StandardTableDefinition = StandardTableDefinitionBuilder.build(); + + % Access Project id for the service account + projectid = gbq.ProjectId; + + % Create a random dataset name + datasetname = gcp.bigquery.JobId.createJobId(); + + % Create a datasetId + datasetId = gcp.bigquery.DatasetId.of(projectid,datasetname); + + % Create datasetInfo + datasetInfo = gcp.bigquery.DatasetInfo.of(datasetId); + % Create datasetfields + datasetField = gcp.bigquery.BigQuery.DatasetField.valuesOf; + % Create datasetOptions with the fields + datasetOption = gcp.bigquery.BigQuery.DatasetOption.fields(datasetField); + % Create a new dataset + dataSet = gbq.create(datasetInfo,datasetOption); %#ok<*NASGU> + + % Create TableId for a table and a given dataset + tableId = gcp.bigquery.TableId.of(datasetname,"new_gbq_tablename"); + + % Create TableInfo: + tableInfo = gcp.bigquery.TableInfo.of(tableId,StandardTableDefinition); + + % Create TableField and TableOption + tableFields = gcp.bigquery.BigQuery.TableField.valueOf('ID','LOCATION'); + tableOption = gcp.bigquery.BigQuery.TableOption.fields(tableFields); + + % Create a new and empty table + emptytable = gbq.create(tableInfo,tableOption); + % Verify Class + testCase.verifyClass(emptytable,'gcp.bigquery.Table'); + + % Clean up Table and Dataset + % Delete Table + tf = gbq.deleteTable(tableId); + % Verify table deleted + testCase.verifyTrue(tf); + fprintf(strcat("\n\nAll GBQ tables deleted from dataset ",datasetname)); + + % Delete dataset + tf = gbq.deleteDataset(datasetname); + % Verify dataset deleted + testCase.verifyTrue(tf); + fprintf("\n\nDataset deleted"); + + fprintf("\nCompleted testing StandardTableDefinition and empty table creation using bigquery.create() for table "); + end + + + + + end + +end +