var bigtable = gcloud.bigtable();
bigtable.getZones(function(err, zones, apiResponse) {});
var zone = bigtable.zone('my-zone');
zone.getClusters(function(err, clusters, apiResponse) {});
zone.createCluster(clusterOptions, function(err, cluster, apiResponse) {});
cluster.getMetadata(function (err, metadata, apiResponse) {});
cluster.setMetadata(metaData, function(err, metadata, apiResponse) {});
cluster.delete(function (err, apiResponse) {});
cluster.restore(function (err, apiResponse) {});
cluster.createTable('my-table', function(err, table, apiResponse) {});
// or
cluster.createTable(tableOptions, function(err, table, apiResponse) {});
var myTable = cluster.table('my-table');
cluster.getTables(function (err, tables, apiResponse) {});
table.getMetadata(function (err, tableSchema, apiResponse) {});
table.delete(function (err, table, apiResponse) {});
table.rename('awesome-table', function (err, table, apiResponse) {});
table.createFamily('user', function (err, family, apiResponse) {});
var userFamily = table.family('user');
userFamily.setMetadata(metaData, function(err, family, apiResponse) {});
userFamily.delete(function(err, apiResponse) {});
If a callback is not provided a stream will be returned
table.getSampleKeys(function (err, keys, apiResponse) {});
If callback is not provided a stream is returned
var rowOptions = {
prefix: 'com.google.'
};
table.getRows(rowOptions, function(err, rows, apiResponse) {});
rowOptions
would be filters used to determine which rows to delete
table.deleteRows(rowOptions, function(err, apiResponse) {});
table.createRow(rowData, function(err, row, apiResponse) {});
table.createRows([rowData], function(err, rows, apiResponse) {});
var myRow = table.row('my-row');
myRow.set('user:name', 'stephen', function(err, row, apiResponse) {});
// or for multiple columns
var rowData = {
user: { // family
name: 'stephen', // column
age: 99 // column
}
};
myRow.set(rowData, function(err, row, apiResponse) {});
myRow.get(['user:name'], function(err, columns, apiResponse) {});
myRow.delete(['user:name'], function(err, columns, apiResponse) {});
myRow.delete(function(err, columns, apiResponse) {});
This should not be confused with the Table#family
which allows you to update/delete families for the entire Table.
var myFamily = myRow.family('user');
// get column
myFamily.get('name', function(err, name, apiResponse) {});
// set column(s)
myFamily.set('name', 'peter', function(err, family, apiResponse) {});
// or
myFamily.set({ name: 'peter' }, function (err, family, apiResponse) {});
// delete column(s)
myFamily.delete(['name'], function(err, family, apiResponse) {});
// delete all columns associated with family
myFamily.delete(function(err, apiResponse) {});
I still choose the second personally. I see the convenience in the first, but it doesn't follow suit with our other APIs, which could be confusing:
We could try to go back over our APIs to support a similar pattern, but even looking at the example above, I'm not sure it's preferred. More specifically,
.bigtable()
should return a reference to a Bigtable object, and.storage()
should return a reference to a Storage object. "gcs.getFiles()" would mean "get all the files from GCS" and "bigtable.table()" (from your example) would mean "get this table from bigtable". The solution to that is obviously naming the vars differently:And with those name changes, we have perspective for how they're supposed to behave. But, it's unexpected to get a cluster back from "gcloud.bigtable" and a bucket back from "gcloud.storage" directly. Having them act as a child class is misleading to their "parent-scope" capabilities.