diff --git a/datastore/metadata.js b/datastore/metadata.js new file mode 100644 index 00000000000..99d24e9e085 --- /dev/null +++ b/datastore/metadata.js @@ -0,0 +1,167 @@ +'use strict'; + +var gcloud = require('gcloud'); + +// This mock is used in the documentation snippets. +var datastore = { + runQuery: function() {} +}; + +function Metadata(projectId) { + this.datastore = gcloud.datastore({ + projectId: projectId + }); +} + +Metadata.prototype.testNamespaceRunQuery = function(callback) { + var self = this; + + datastore.createQuery = this.datastore.createQuery; + datastore.key = this.datastore.key; + + var startNamespace = 'Animals'; + var endNamespace = 'Zoos'; + + this.datastore.save([ + { + key: datastore.key({ + namespace: 'Animals', + path: ['Ant', 1] + }), + data: {} + } + ], function(err) { + if (err) { + callback(err); + return; + } + + // jshint unused:false + // [START namespace_run_query] + var query = datastore.createQuery('__namespace__') + .select('__key__') + .filter('__key__ >=', datastore.key(['__namespace__', startNamespace])) + .filter('__key__ <', datastore.key(['__namespace__', endNamespace])); + + datastore.runQuery(query, function(err, entities) { + if (err) { + // An error occurred while running the query. + return; + } + + var namespaces = entities.map(function(entity) { + return entity.key.path.pop(); + }); + }); + // [END namespace_run_query] + + self.datastore.runQuery(query, callback); + }); +}; + +Metadata.prototype.testKindRunQuery = function(callback) { + datastore.createQuery = this.datastore.createQuery; + + // jshint unused:false + // [START kind_run_query] + var query = datastore.createQuery('__kind__') + .select('__key__'); + + datastore.runQuery(query, function(err, entities) { + if (err) { + // An error occurred while running the query. + return; + } + + var kinds = entities.map(function(entity) { + return entity.key.path.pop(); + }); + }); + // [END kind_run_query] + + this.datastore.runQuery(query, callback); +}; + +Metadata.prototype.testPropertyRunQuery = function(callback) { + datastore.createQuery = this.datastore.createQuery; + + // [START property_run_query] + var query = datastore.createQuery('__property__') + .select('__key__'); + + datastore.runQuery(query, function(err, entities) { + if (err) { + // An error occurred while running the query. + return; + } + + var propertiesByKind = {}; + + entities.forEach(function(entity) { + var kind = entity.key.path[1]; + var propertyName = entity.key.path[3]; + + propertiesByKind[kind] = propertiesByKind[kind] || []; + propertiesByKind[kind].push(propertyName); + }); + + // propertiesByKind = { + // Task: [ + // 'collaborators', + // 'created', + // 'description', + // 'done', + // 'percent_complete', + // 'priority', + // 'tags', + // 'type' + // ] + // } + }); + // [END property_run_query] + + this.datastore.runQuery(query, callback); +}; + +Metadata.prototype.testPropertyByKindRunQuery = function(callback) { + var datastore = this.datastore; + + // jshint camelcase:false + // [START property_by_kind_run_query] + var ancestorKey = datastore.key(['__kind__', 'Task']); + + var query = datastore.createQuery('__property__') + .hasAncestor(ancestorKey); + + datastore.runQuery(query, function(err, entities) { + if (err) { + // An error occurred while running the query. + return; + } + + var representationsByProperty = {}; + + entities.forEach(function(entity) { + var propertyName = entity.key.path.pop(); + var propertyType = entity.data.property_representation; + + representationsByProperty[propertyName] = propertyType; + }); + + // representationsByProperty = { + // collaborators: [ 'STRING' ], + // created: [ 'INT64' ], + // description: [ 'STRING' ], + // done: [ 'BOOLEAN' ], + // percent_complete: [ 'INT64' ], + // priority: [ 'INT64' ], + // tags: [ 'STRING' ], + // type: [ 'STRING' ] + // } + }); + // [END property_by_kind_run_query] + + this.datastore.runQuery(query, callback); +}; + +module.exports = Metadata; \ No newline at end of file diff --git a/test/datastore/testMetadata.js b/test/datastore/testMetadata.js new file mode 100644 index 00000000000..7bf08dd95cc --- /dev/null +++ b/test/datastore/testMetadata.js @@ -0,0 +1,32 @@ +'use strict'; + +var Metadata = require('../../datastore/metadata'); +var metadata; + +before(function() { + metadata = new Metadata(process.env.TEST_PROJECT_ID); +}); + +describe('namespace query', function() { + it('performs a namespace query', function(done) { + metadata.testNamespaceRunQuery(done); + }); +}); + +describe('kinds query', function() { + it('performs a kind query', function(done) { + metadata.testKindRunQuery(done); + }); +}); + +describe('property query', function() { + it('performs a property query', function(done) { + metadata.testPropertyRunQuery(done); + }); +}); + +describe('property by kind query', function() { + it('performs a property by kind query', function(done) { + metadata.testPropertyByKindRunQuery(done); + }); +});