不要怂,就是干,撸起袖子干!

Commit b1df8684 by Mick Hansen

fix(jsonb): boolean and integer checks

1 parent 239a493b
...@@ -1753,23 +1753,39 @@ module.exports = (function() { ...@@ -1753,23 +1753,39 @@ module.exports = (function() {
traverse = function (prop, item, path) { traverse = function (prop, item, path) {
var $where = {} var $where = {}
, $key; , $key
, $baseKey = self.quoteIdentifier(key)+'#>>\'{'+path.join(', ')+'}\'';
$key = new Utils.literal(self.quoteIdentifier(key)+'#>>\'{'+path.join(', ')+'}\''); if (options.prefix) {
if (options.prefix instanceof Utils.literal) {
$baseKey = self.handleSequelizeMethod(options.prefix)+'.'+$baseKey;
} else {
$baseKey = self.quoteTable(options.prefix)+'.'+$baseKey;
}
}
$baseKey = '('+$baseKey+')';
if (_.isPlainObject(item)) { if (_.isPlainObject(item)) {
_.forOwn(item, function ($item, $prop) { _.forOwn(item, function ($item, $prop) {
if ($prop.indexOf('$') === 0) { if ($prop.indexOf('$') === 0) {
$where[$prop] = $item; $where[$prop] = $item;
$key = $baseKey;
$items.push(self.whereItemQuery($key, $where, _.pick(options, 'prefix'))); if (typeof $item === "number") {
$key += '::integer';
}
$items.push(self.whereItemQuery(new Utils.literal($key), $where/*, _.pick(options, 'prefix')*/));
} else { } else {
traverse($prop, $item, path.concat([$prop])); traverse($prop, $item, path.concat([$prop]));
} }
}); });
} else { } else {
$where.$eq = item; $where.$eq = item;
$items.push(self.whereItemQuery($key, $where, _.pick(options, 'prefix')));
$key = new Utils.literal($baseKey);
$items.push(self.whereItemQuery($key, $where/*, _.pick(options, 'prefix')*/));
} }
}; };
......
...@@ -93,6 +93,92 @@ describe(Support.getTestDialectTeaser('Model'), function() { ...@@ -93,6 +93,92 @@ describe(Support.getTestDialectTeaser('Model'), function() {
}); });
}); });
it('should be possible to query a nested integer value', function () {
return Promise.join(
this.Event.create({
data: {
name: {
first: 'Homer',
last: 'Simpson'
},
age: 40
}
}),
this.Event.create({
data: {
name: {
first: 'Marge',
last: 'Simpson'
},
age: 37
}
})
).bind(this).then(function () {
return this.Event.findAll({
where: {
data: {
age: {
$gt: 38
}
}
}
}).then(function (events) {
var event = events[0];
expect(events.length).to.equal(1);
expect(event.get('data')).to.eql({
name: {
first: 'Homer',
last: 'Simpson'
},
age: 40
});
});
});
});
it('should be possible to query a nested null value', function () {
return Promise.join(
this.Event.create({
data: {
name: {
first: 'Homer',
last: 'Simpson'
},
employment: 'Nuclear Safety Inspector'
}
}),
this.Event.create({
data: {
name: {
first: 'Marge',
last: 'Simpson'
},
employment: null
}
})
).bind(this).then(function () {
return this.Event.findAll({
where: {
data: {
employment: null
}
}
}).then(function (events) {
var event = events[0];
expect(events.length).to.equal(1);
expect(event.get('data')).to.eql({
name: {
first: 'Marge',
last: 'Simpson'
},
employment: null
});
});
});
});
it('should be possible to query multiple nested values', function () { it('should be possible to query multiple nested values', function () {
return Promise.join( return Promise.join(
this.Event.create({ this.Event.create({
......
...@@ -473,7 +473,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -473,7 +473,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
}, },
prefix: 'User' prefix: 'User'
}, { }, {
default: "[User].[data]#>>'{nested, attribute}' = 'value'" default: "([User].[data]#>>'{nested, attribute}') = 'value'"
}); });
testsql('data', { testsql('data', {
...@@ -489,7 +489,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -489,7 +489,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
}, },
prefix: 'User' prefix: 'User'
}, { }, {
default: "([User].[data]#>>'{nested, attribute}' = 'value' AND [User].[data]#>>'{nested, prop}' != 'None')" default: "(([User].[data]#>>'{nested, attribute}') = 'value' AND ([User].[data]#>>'{nested, prop}') != 'None')"
}); });
testsql('data', { testsql('data', {
...@@ -505,7 +505,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -505,7 +505,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
}, },
prefix: 'User' prefix: 'User'
}, { }, {
default: "([User].[data]#>>'{name, last}' = 'Simpson' AND [User].[data]#>>'{employment}' != 'None')" default: "(([User].[data]#>>'{name, last}') = 'Simpson' AND ([User].[data]#>>'{employment}') != 'None')"
}); });
testsql('data.nested.attribute', 'value', { testsql('data.nested.attribute', 'value', {
...@@ -517,7 +517,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -517,7 +517,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
} }
} }
}, { }, {
default: "[data]#>>'{nested, attribute}' = 'value'" default: "([data]#>>'{nested, attribute}') = 'value'"
}); });
testsql('data.nested.attribute', { testsql('data.nested.attribute', {
...@@ -531,7 +531,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -531,7 +531,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
} }
} }
}, { }, {
default: "[data]#>>'{nested, attribute}' IN (3, 7)" default: "([data]#>>'{nested, attribute}') IN (3, 7)"
}); });
testsql('data', { testsql('data', {
...@@ -545,7 +545,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() { ...@@ -545,7 +545,7 @@ suite(Support.getTestDialectTeaser('SQL'), function() {
type: new DataTypes.JSONB() type: new DataTypes.JSONB()
} }
}, { }, {
default: "[data]#>>'{nested, attribute}' > 2" default: "([data]#>>'{nested, attribute}')::integer > 2"
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!