From 7819b3b185980dc71fd420e7d79834009deca8e0 Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Fri, 12 Oct 2012 22:06:56 +0100 Subject: [PATCH] [#248,model][s]: normalize Field types where possible by mapping standard type aliases to default type name - fixes #248. * view.graph.js improve graph view by making sure datetime for an axis is judged by whether it is date, datetime or time not just date! * backend.ckan.js some type conversions now done in core model so can be removed --- docs/models.markdown | 6 +++--- src/backend.ckan.js | 5 +---- src/model.js | 16 +++++++++++++++- src/view.graph.js | 6 ++++-- test/model.test.js | 22 ++++++++++++++++++++++ 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/docs/models.markdown b/docs/models.markdown index 03c1ca88..593979ba 100644 --- a/docs/models.markdown +++ b/docs/models.markdown @@ -118,12 +118,12 @@ The type list is as follows (brackets indicate possible aliases for specific types - these types will be recognized and normalized to the default type name for that type): -* string (text) -* number (double, float) - a number including floating point numbers. +* string (text) - a string +* number (double, float, numeric) - a number including floating point numbers. * integer (int) - an integer. * date - a date. The preferred format is YYYY-MM-DD. * time - a time without a date -* date-time (dateTime, timestamp) a date-time. It is recommended this be in ISO 8601 +* date-time (datetime, timestamp) a date-time. It is recommended this be in ISO 8601 format of YYYY-MM- DDThh:mm:ssZ in UTC time. * boolean (bool) * binary - base64 representation of binary data. diff --git a/src/backend.ckan.js b/src/backend.ckan.js index 9066f35e..edea9b06 100644 --- a/src/backend.ckan.js +++ b/src/backend.ckan.js @@ -94,10 +94,7 @@ this.recline.Backend.Ckan = this.recline.Backend.Ckan || {}; var CKAN_TYPES_MAP = { 'int4': 'integer', 'int8': 'integer', - 'float8': 'float', - 'text': 'string', - 'json': 'object', - 'timestamp': 'date' + 'float8': 'float' }; }(jQuery, this.recline.Backend.Ckan)); diff --git a/src/model.js b/src/model.js index 583cf780..712475a6 100644 --- a/src/model.js +++ b/src/model.js @@ -380,6 +380,9 @@ my.Field = Backbone.Model.extend({ if (this.attributes.label === null) { this.set({label: this.id}); } + if (this.attributes.type.toLowerCase() in this._typeMap) { + this.attributes.type = this._typeMap[this.attributes.type.toLowerCase()]; + } if (options) { this.renderer = options.renderer; this.deriver = options.deriver; @@ -389,6 +392,17 @@ my.Field = Backbone.Model.extend({ } this.facets = new my.FacetList(); }, + _typeMap: { + 'text': 'string', + 'double': 'number', + 'float': 'number', + 'numeric': 'number', + 'int': 'integer', + 'datetime': 'date-time', + 'bool': 'boolean', + 'timestamp': 'date-time', + 'json': 'object' + }, defaultRenderers: { object: function(val, field, doc) { return JSON.stringify(val); @@ -396,7 +410,7 @@ my.Field = Backbone.Model.extend({ geo_point: function(val, field, doc) { return JSON.stringify(val); }, - 'float': function(val, field, doc) { + 'number': function(val, field, doc) { var format = field.get('format'); if (format === 'percentage') { return val + '%'; diff --git a/src/view.graph.js b/src/view.graph.js index c292a955..bcde3e57 100644 --- a/src/view.graph.js +++ b/src/view.graph.js @@ -145,7 +145,8 @@ my.Graph = Backbone.View.extend({ var xfield = self.model.fields.get(self.state.attributes.group); // time series - var isDateTime = xfield.get('type') === 'date'; + var xtype = xfield.get('type'); + var isDateTime = (xtype === 'date' || xtype === 'date-time' || xtype === 'time'); if (self.model.records.models[parseInt(x)]) { x = self.model.records.models[parseInt(x)].get(self.state.attributes.group); @@ -259,7 +260,8 @@ my.Graph = Backbone.View.extend({ var x = doc.getFieldValue(xfield); // time series - var isDateTime = xfield.get('type') === 'date'; + var xtype = xfield.get('type'); + var isDateTime = (xtype === 'date' || xtype === 'date-time' || xtype === 'time'); if (isDateTime) { // datetime diff --git a/test/model.test.js b/test/model.test.js index 46aa6195..b5ca41c6 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -38,6 +38,28 @@ test('Field: basics', function () { equal('XX', out[0].label); }); +test('Field: type mapping', function () { + var tests = [ + { input: 'text', exp: 'string'}, + { input: 'int', exp: 'integer'}, + { input: 'float', exp: 'number'}, + { input: 'double', exp: 'number'}, + { input: 'datetime', exp: 'date-time'}, + { input: 'dateTime', exp: 'date-time'}, + { input: 'bool', exp: 'boolean'}, + { input: 'timestamp', exp: 'date-time'}, + { input: 'json', exp: 'object'} + ]; + + _.each(tests, function(data) { + var field = new recline.Model.Field({ + id: 'x', + type: data.input + }); + equal(field.get('type'), data.exp); + }); +}); + test('Field: default renderers', function () { var doc = new recline.Model.Record({ x: 12.3,