diff --git a/anydb-sql.js b/anydb-sql.js index 7172edb..af1e178 100644 --- a/anydb-sql.js +++ b/anydb-sql.js @@ -212,6 +212,8 @@ module.exports = function (opt) { var name = c.alias || c.name; if (c.primaryKey && !c.aggregator) name = name + '##'; + else if (c.dataType == 'json') + name = name + "##json"; return name; } diff --git a/lib/grouper.js b/lib/grouper.js index a77d31c..a60b2c5 100644 --- a/lib/grouper.js +++ b/lib/grouper.js @@ -119,8 +119,10 @@ function clean(val, cleaner) { var key = keys[k]; var newkey = key.replace(cleaner, ''); var item = val[key]; - if (/{}$/.test(key) && item instanceof Array) { - console.log(key, "is same with", newkey); + + if (/##json$/.test(key)) + newkey = key.replace('##json', ''); + else if (/{}$/.test(key) && item instanceof Array) { item = clean(item[0], cleaner); } else if (item instanceof Array || isObject(item)) @@ -168,22 +170,14 @@ function removeDepth(rows) { } function isGroup(val, key) { - return isObject(val); + return isObject(val) && !(/##json$/).test(key); } function isKey(val, key) { return (/##$/).test(key); } -function isGroup(val, key) { - return isObject(val); -} - -function isKey(val, key) { - return (/##$/).test(key); -} - -var cleanRegex = /(\[\]|##|\{\})$/; +var cleanRegex = /(\[\]|##|\{\}|##json)$/; function checkKeys(row, reg) { @@ -261,7 +255,7 @@ function normalizerSegment(obj, base) { var key = keys[k]; var item = obj[key]; var accessor = base ? base + '.' + key : key; - if (!isObject(item)) { + if (!isObject(item) || /##json$/.test(key)) { arr.push('"' + key + '": row["' + accessor + '"]'); } else { arr.push('"' + key + '":' + normalizerSegment(item, accessor)); diff --git a/test/grouper.js b/test/grouper.js index 7559c14..96d5b2a 100644 --- a/test/grouper.js +++ b/test/grouper.js @@ -20,7 +20,7 @@ var grouperData = require('./lib/grouper-data'); function groupTest(val, key) { - return grouper.isObject(val); + return grouper.isObject(val) && !(/##json$/).test(key); //return grouper.isObject(val) && !/\!\!$/.test(key); } @@ -34,7 +34,7 @@ var group = grouper.group, clean = grouper.clean; function grouperTest(desc, inData, outData) { t.test(desc, function(t) { var grouped = group(inData, groupTest, eqTest); - var ungrouped = clean(grouped, /(\[\]|##|\{\})$/); + var ungrouped = clean(grouped, /(\[\]|##|\{\}|##json)$/); //console.log(util.inspect(ungrouped, false, 5)); t.deepEquals(ungrouped, outData); t.end(); @@ -49,12 +49,14 @@ grouperTest("deep but no nesting of non-groups", var nested = [ - {'id##': 1, metadata: [{a: 1}, {a: 2}]}, - {'id##': 2, metadata: [{b: 5}, {b: 8}]} + {'id##': 1, 'metadata##json': [{a: 1}, {a: 2}]}, + {'id##': 2, 'metadata##json': [{b: 5}, {b: 8}]}, + {'id##': 3, 'metadata##json': [{b: 8}, {b: 7,c:[1,2,3]}]} ]; var nestedOut = [ {'id': 1, metadata: [{a: 1}, {a: 2}]}, - {'id': 2, metadata: [{b: 5}, {b: 8}]} + {'id': 2, metadata: [{b: 5}, {b: 8}]}, + {'id': 3, metadata: [{b: 8}, {b: 7,c:[1,2,3]}]} ];