Skip to content

Commit 86260c8

Browse files
committed
Allow custom property names & custom selects
1 parent db565e1 commit 86260c8

10 files changed

Lines changed: 209 additions & 92 deletions

File tree

lib/Associations/Many.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ exports.prepare = function (Model, associations) {
3535
props = {};
3636
} else {
3737
for (var k in props) {
38-
props[k] = Property.normalize(props[k], {}, Model.settings);
38+
props[k] = Property.normalize({
39+
prop: props[k], name: k, customTypes: {}, settings: Model.settings
40+
});
3941
}
4042
}
4143

@@ -59,7 +61,6 @@ exports.prepare = function (Model, associations) {
5961
delAccessor : opts.delAccessor || ("remove" + assocTemplateName),
6062
addAccessor : opts.addAccessor || ("add" + assocTemplateName)
6163
};
62-
6364
associations.push(association);
6465

6566
if (opts.reverse) {

lib/Instance.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,14 @@ function Instance(Model, opts) {
151151
prop = Model.allProperties[k];
152152

153153
if (prop) {
154-
if (prop.type === 'serial' && opts.data[k] == null) continue;
154+
if (opts.data[k] == null && (prop.type == 'serial' || typeof prop.defaultValue == 'function')) {
155+
continue;
156+
}
155157

156-
data[k] = Property.validate(opts.data[k], prop);
157158
if (opts.driver.propertyToValue) {
158-
data[k] = opts.driver.propertyToValue(data[k], prop);
159+
data[prop.mapsTo] = opts.driver.propertyToValue(opts.data[k], prop);
160+
} else {
161+
data[prop.mapsTo] = opts.data[k];
159162
}
160163
} else {
161164
data[k] = opts.data[k];
@@ -195,7 +198,7 @@ function Instance(Model, opts) {
195198

196199
opts.changes.length = 0;
197200
for (var i = 0; i < opts.id.length; i++) {
198-
opts.data[opts.id[i]] = info.hasOwnProperty(opts.id[i]) ? info[opts.id[i]] : data[opts.id[i]];
201+
opts.data[opts.id[i]] = info.hasOwnProperty(opts.id[i]) ? info[opts.id[i]] : data[opts.id[i]];
199202
}
200203
opts.is_new = false;
201204

@@ -337,7 +340,7 @@ function Instance(Model, opts) {
337340
if (!opts.data.hasOwnProperty(opts.extrachanges[i])) continue;
338341

339342
if (opts.extra[opts.extrachanges[i]]) {
340-
data[opts.extrachanges[i]] = Property.validate(opts.data[opts.extrachanges[i]], opts.extra[opts.extrachanges[i]]);
343+
data[opts.extrachanges[i]] = opts.data[opts.extrachanges[i]];
341344
if (opts.driver.propertyToValue) {
342345
data[opts.extrachanges[i]] = opts.driver.propertyToValue(data[opts.extrachanges[i]], opts.extra[opts.extrachanges[i]]);
343346
}
@@ -394,8 +397,7 @@ function Instance(Model, opts) {
394397
changes[key] = value;
395398

396399
if (Model.properties[key]) {
397-
changes[key] = Property.validate(changes[key], Model.properties[key]);
398-
if (opts.driver.propertyToValue) {
400+
if (opts.driver.propertyToValue) {
399401
changes[key] = opts.driver.propertyToValue(changes[key], Model.properties[key]);
400402
}
401403
}

lib/Model.js

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ function Model(opts) {
3333
var extend_associations = [];
3434
var association_properties = [];
3535
var model_fields = [];
36+
var fieldToPropertyMap = {};
3637
var allProperties = {};
3738

3839
var createHookHelper = function (hook) {
@@ -142,6 +143,18 @@ function Model(opts) {
142143
return instance;
143144
};
144145

146+
var mapDatastoreFieldsToProperties = function (dataIn) {
147+
var k, prop;
148+
var dataOut = {};
149+
150+
for (k in dataIn) {
151+
prop = fieldToPropertyMap[k];
152+
if (!prop) dataOut[k] = dataIn[k];
153+
else dataOut[prop.name] = dataIn[k];
154+
}
155+
return dataOut;
156+
}
157+
145158
var model = function () {
146159
var instance, i;
147160

@@ -283,16 +296,18 @@ function Model(opts) {
283296
return cb(new ORMError(err.message, 'QUERY_ERROR', { originalCode: err.code }));
284297
}
285298
if (data.length === 0) {
286-
return cb(new ORMError("Not found", 'NOT_FOUND', { model: opts.table }));
299+
return cb(new ORMError("Not found", 'NOT_FOUND', { model: opts.table }));
287300
}
288301

302+
data = mapDatastoreFieldsToProperties(data[0]);
303+
289304
var uid = opts.driver.uid + "/" + opts.table + "/" + ids.join("/");
290305

291306
Singleton.get(uid, {
292307
cache : (options.hasOwnProperty("cache") ? options.cache : opts.cache),
293308
save_check : opts.settings.get("instance.cacheSaveCheck")
294309
}, function (cb) {
295-
return createInstance(data[0], {
310+
return createInstance(data, {
296311
uid : uid,
297312
autoSave : options.autoSave,
298313
autoFetch : (options.autoFetchLimit === 0 ? false : options.autoFetch),
@@ -630,22 +645,32 @@ function Model(opts) {
630645
}
631646
}
632647

633-
var cur_fields = {};
648+
var currFields = {}, cType;
649+
634650
// standardize properties
635651
for (k in opts.properties) {
636-
opts.properties[k] = Property.normalize(opts.properties[k], opts.db.customTypes, opts.settings);
637-
opts.properties[k].klass = 'primary';
638-
allProperties[k] = opts.properties[k];
652+
var prop = opts.properties[k] = Property.normalize({
653+
prop: opts.properties[k], name: k,
654+
customTypes: opts.db.customTypes, settings: opts.settings
655+
});
656+
prop.klass = 'primary';
657+
allProperties[k] = prop;
658+
fieldToPropertyMap[prop.mapsTo] = prop;
639659

640660
if (opts.id.indexOf(k) != -1) {
641-
opts.properties[k].key = true;
661+
prop.key = true;
642662
}
643-
644-
if (opts.properties[k].lazyload !== true && !cur_fields[k]) {
645-
cur_fields[k] = true;
646-
model_fields.push(opts.properties[k].select || k);
663+
if (prop.lazyload !== true && !currFields[k]) {
664+
currFields[k] = true;
665+
if ((cType = opts.db.customTypes[prop.type]) && cType.datastoreGet) {
666+
model_fields.push({
667+
a: prop.mapsTo, sql: cType.datastoreGet(prop, opts.db.driver.query)
668+
});
669+
} else {
670+
model_fields.push(prop.mapsTo);
671+
}
647672
}
648-
if (opts.properties[k].required) {
673+
if (prop.required) {
649674
// Prepend `required` validation
650675
if(opts.validations.hasOwnProperty(k)) {
651676
opts.validations[k].splice(0, 0, Validators.required());
@@ -657,9 +682,11 @@ function Model(opts) {
657682

658683
for (var i = 0; i < opts.id.length; i++) {
659684
k = opts.id[i];
660-
allProperties[k] = opts.properties[k] || {
661-
type: 'serial', rational: 'false', key: true, klass: 'key'
662-
};
685+
allProperties[k] = opts.properties[k] || Property.normalize({
686+
prop: {type: 'serial', rational: 'false', key: true, klass: 'key'},
687+
name: k, customTypes: opts.db.customTypes, settings: opts.settings
688+
});
689+
fieldToPropertyMap[allProperties[k].mapsTo] = allProperties[k];
663690
}
664691
model_fields = opts.id.concat(model_fields);
665692

lib/Property.js

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,54 @@
11
var ORMError = require("./Error");
22

3-
exports.normalize = function (prop, customTypes, Settings) {
4-
if (typeof prop === "function") {
5-
switch (prop.name) {
3+
exports.normalize = function (opts) {
4+
if (typeof opts.prop === "function") {
5+
switch (opts.prop.name) {
66
case "String":
7-
prop = { type: "text" };
7+
opts.prop = { type: "text" };
88
break;
99
case "Number":
10-
prop = { type: "number" };
10+
opts.prop = { type: "number" };
1111
break;
1212
case "Boolean":
13-
prop = { type: "boolean" };
13+
opts.prop = { type: "boolean" };
1414
break;
1515
case "Date":
16-
prop = { type: "date" };
16+
opts.prop = { type: "date" };
1717
break;
1818
case "Object":
19-
prop = { type: "object" };
19+
opts.prop = { type: "object" };
2020
break;
2121
case "Buffer":
22-
prop = { type: "binary" };
22+
opts.prop = { type: "binary" };
2323
break;
2424
}
25-
} else if (typeof prop === "string") {
26-
var tmp = prop;
27-
prop = {};
28-
prop.type = tmp;
29-
} else if (Array.isArray(prop)) {
30-
prop = { type: "enum", values: prop };
25+
} else if (typeof opts.prop === "string") {
26+
var tmp = opts.prop;
27+
opts.prop = {};
28+
opts.prop.type = tmp;
29+
} else if (Array.isArray(opts.prop)) {
30+
opts.prop = { type: "enum", values: opts.prop };
3131
}
3232

33-
if ([ "text", "number", "boolean", "date", "enum", "object", "binary", "point" ].indexOf(prop.type) === -1) {
34-
if (!(prop.type in customTypes)) {
35-
throw new ORMError("Unknown property type: " + prop.type, 'NO_SUPPORT');
33+
if ([ "text", "number", "boolean", "serial", "date", "enum", "object", "binary", "point" ].indexOf(opts.prop.type) === -1) {
34+
if (!(opts.prop.type in opts.customTypes)) {
35+
throw new ORMError("Unknown opts.property type: " + opts.prop.type, 'NO_SUPPORT');
3636
}
3737
}
3838

39-
if (!prop.hasOwnProperty("required") && Settings.get("properties.required")) {
40-
prop.required = true;
39+
if (!opts.prop.hasOwnProperty("required") && opts.settings.get("properties.required")) {
40+
opts.prop.required = true;
4141
}
4242

43-
if (prop.type == "number" && !prop.hasOwnProperty("rational")) {
44-
prop.rational = true;
43+
if (opts.prop.type == "number" && !opts.prop.hasOwnProperty("rational")) {
44+
opts.prop.rational = true;
4545
}
4646

47-
return prop;
48-
};
47+
if (!('mapsTo' in opts.prop)) {
48+
opts.prop.mapsTo = opts.name
49+
}
50+
51+
opts.prop.name = opts.name;
4952

50-
exports.validate = function (value, prop) {
51-
return value;
53+
return opts.prop;
5254
};

lib/Utilities.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
_ = require('lodash')
2+
13
/**
24
* Order should be a String (with the property name assumed ascending)
35
* or an Array or property String names.
@@ -176,7 +178,12 @@ exports.wrapFieldObject = function (obj, model, altName, alternatives) {
176178

177179
var new_obj = {};
178180

179-
new_obj[obj] = alternatives[obj] || alternatives[model.id[0]] || { type: 'number', unsigned: true, rational: false };
181+
new_obj[obj] = _.cloneDeep(
182+
alternatives[obj] || alternatives[model.id[0]] || { type: 'number', unsigned: true, rational: false }
183+
);
184+
new_obj[obj].name = obj;
185+
new_obj[obj].mapsTo = obj;
186+
180187

181188
return new_obj;
182189
};
@@ -207,15 +214,19 @@ exports.formatField = function (model, name, required, reversed) {
207214
time : p.time || false,
208215
big : p.big || false,
209216
values : p.values || null,
210-
required : required
217+
required : required,
218+
name : field_name,
219+
mapsTo : field_name
211220
};
212221
} else {
213222
field_opts = {
214223
type : "number",
215224
unsigned : true,
216225
rational : false,
217226
size : 4,
218-
required : required
227+
required : required,
228+
name : field_name,
229+
mapsTo : field_name
219230
};
220231
}
221232

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
"analyse" : false,
3838
"dependencies": {
3939
"enforce" : "0.1.2",
40-
"sql-query" : "0.1.16",
41-
"sql-ddl-sync" : "git://github.com/dresende/node-sql-ddl-sync.git#v0.2.3",
40+
"sql-query" : "git://github.com/dresende/node-sql-query.git#custom-properties",
41+
"sql-ddl-sync" : "git://github.com/dresende/node-sql-ddl-sync.git#custom-properties",
4242
"hat" : "0.0.3",
4343
"lodash" : "2.4.1"
4444
},

0 commit comments

Comments
 (0)