Big Query object-to-row mapper.
Big Querier helps to automatically map objects to big query insert rows and vice-versa. There are 3 parts of big querier, each of them can be used separately:
- The Client: A Big Query wrapper that simplifies query creation and result retrieval.
- The Contract: A Row-to-object mapper, can convert object to row for insertion or selected row back to object.
- The Dispatcher Service: A backend logger helper that dispatches logs to BigQuery in background.
var client = new Trafi.BigQuerier.BigQueryClient(
"trafi-app-dev",
"../Much/Path/To/Cert.p12",
"very-secret",
"very-mail@developer.gserviceaccount.com"
);
Has method to get or create a table:
var table = await client
.GetTableClient("dataset_id", "table_id", yourSchema);
And then insert a row:
await table.InsertRows(new[] {
new BigQueryInsertRow { ... }
});
Or get the rows:
var results = await client
.Query("SELECT * FROM dataset_id.table_id");
This library throws BigQuerierException
exceptions.
Describe your contract:
[QuerierContract]
class Item
{
public string Name { get; set; }
public long? Count { get; set; }
public long[] Values { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? ModifiedAt { get; set; }
}
[QuerierContract]
class MyItem
{
public string MyKey { get; set; }
public bool? MyValue { get; set; }
public Item[] Items { get; set; }
public string[] Strings { get; set; }
public long[] Values { get; set; }
public Item Subitem { get; set; }
}
Supported types are:
string
,int
,long
,double
,bool
,DateTime
;- arrays or optional values of all mentioned types;
- arrays of other contracts;
- other contracts as properties.
Start by creating a contract. This auto-generates a mapper that can be reused:
var contract = Contract<MyItem>.Create();
Contract builds schema for you, so it's easier to create tables:
var table = await client
.GetTableClient("dataset_id", "table_id", contract.Schema);
Contract helps to convert your items to rows:
var row = contract.ToRow(
new MyItem
{
MyKey = "0001",
MyValue = false,
Items = new Item[]
{
new Item
{
Name = "Nerijus",
CreatedAt = DateTime.UtcNow,
ModifiedAt = DateTime.UtcNow,
}
},
Strings = new string[] {"A", "B", "C"},
Values = new long[] {42, 11, 111},
Subitem = new Item
{
Name = "Stuff",
Count = 3,
Values = new long[] {42, 11, 111},
CreatedAt = DateTime.UtcNow,
},
}
);
await table.InsertRows(new[] {row});
Contract helps to convert rows back to items:
var rowsEnumerable = await client.Query("SELECT * FROM dataset_id.table_id");
var rows = await rowsEnumerable.Select(contract.FromRow).ToList();
It is possible to specify query options and cancellation token, both are optional. As an example, we can fall back to Legacy SQL dialect (Google's BigQuery client uses Standard SQL by default):
using Google.Cloud.BigQuery.V2;
var rowsEnumerable = await client
.Query(
"SELECT * FROM dataset_id.table_id",
options: new QueryOptions { UseLegacySql = true },
ct: ct
);
var rows = await rowsEnumerable
.Select(contract.FromRow)
.ToList(ct);
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.