switch long and lat for geopoint type
MySQL expects reverse order of latitude and longitude from the way we use it in LoopBack, so switch the order when saving and loading Point spatial type we use for Point/GeoPoint.
This commit is contained in:
parent
8dfe41b9b5
commit
3dad2bf4df
|
@ -365,7 +365,7 @@ MySQL.prototype.toColumnValue = function(prop, val) {
|
|||
if (prop.type.name === 'GeoPoint') {
|
||||
return new ParameterizedSQL({
|
||||
sql: 'Point(?,?)',
|
||||
params: [val.lat, val.lng],
|
||||
params: [val.lng, val.lat],
|
||||
});
|
||||
}
|
||||
if (prop.type === Buffer) {
|
||||
|
@ -426,8 +426,8 @@ MySQL.prototype.fromColumnValue = function(prop, val) {
|
|||
case 'GeoPoint':
|
||||
case 'Point':
|
||||
val = {
|
||||
lat: val.x,
|
||||
lng: val.y,
|
||||
lng: val.x,
|
||||
lat: val.y,
|
||||
};
|
||||
break;
|
||||
case 'List':
|
||||
|
|
|
@ -9,6 +9,7 @@ var assert = require('assert');
|
|||
var _ = require('lodash');
|
||||
|
||||
var db, BlobModel, EnumModel, ANIMAL_ENUM, City, Account;
|
||||
|
||||
var mysqlVersion;
|
||||
|
||||
describe('MySQL specific datatypes', function() {
|
||||
|
@ -58,7 +59,7 @@ describe('MySQL specific datatypes', function() {
|
|||
|
||||
it('create an instance', function(done) {
|
||||
Account.create(data, function(err, result) {
|
||||
assert(!err);
|
||||
if (err) return done(err);
|
||||
assert(result);
|
||||
assert(_.isEqual(data.length, result.length));
|
||||
assert(_.isEqual(data[0].amount, result[0].amount));
|
||||
|
@ -69,7 +70,7 @@ describe('MySQL specific datatypes', function() {
|
|||
|
||||
it('find an instance', function(done) {
|
||||
Account.find(function(err, result) {
|
||||
assert(!err);
|
||||
if (err) return done(err);
|
||||
assert(result);
|
||||
assert(_.isEqual(data.length, result.length));
|
||||
assert(_.isEqual(data[0].amount, result[0].amount));
|
||||
|
@ -82,7 +83,7 @@ describe('MySQL specific datatypes', function() {
|
|||
|
||||
it('find an instance by id', function(done) {
|
||||
Account.findById(1, function(err, result) {
|
||||
assert(!err);
|
||||
if (err) return done(err);
|
||||
assert(result);
|
||||
assert(_.isEqual(data[0].amount, result.amount));
|
||||
assert(_.isEqual(dateForTransactions[0], result.lastTransaction));
|
||||
|
@ -97,7 +98,7 @@ describe('MySQL specific datatypes', function() {
|
|||
users: {},
|
||||
};
|
||||
Account.update({id: 1}, updatedData, function(err, result) {
|
||||
assert(!err);
|
||||
if (err) return done(err);
|
||||
assert(result);
|
||||
assert(result.count);
|
||||
assert.equal(1, result.count);
|
||||
|
@ -125,10 +126,10 @@ describe('MySQL specific datatypes', function() {
|
|||
|
||||
it('should create a model instance with Enums', function(done) {
|
||||
var em = EnumModel.create({animal: ANIMAL_ENUM.CAT, condition: 'sleepy', mood: 'happy'}, function(err, obj) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(obj.condition, 'sleepy');
|
||||
EnumModel.findOne({where: {animal: ANIMAL_ENUM.CAT}}, function(err, found) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(found.mood, 'happy');
|
||||
assert.equal(found.animal, ANIMAL_ENUM.CAT);
|
||||
done();
|
||||
|
@ -153,10 +154,10 @@ describe('MySQL specific datatypes', function() {
|
|||
var extras = {c: 3, d: '4'};
|
||||
var em = EnumModel.create({animal: ANIMAL_ENUM.DOG, condition: 'sleepy',
|
||||
mood: 'happy', note: note, extras: extras}, function(err, obj) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(obj.condition, 'sleepy');
|
||||
EnumModel.findOne({where: {animal: ANIMAL_ENUM.DOG}}, function(err, found) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(found.mood, 'happy');
|
||||
assert.equal(found.animal, ANIMAL_ENUM.DOG);
|
||||
assert.deepEqual(found.note, note);
|
||||
|
@ -170,15 +171,43 @@ describe('MySQL specific datatypes', function() {
|
|||
var name = 'bob';
|
||||
var bob = {name: name, bin: new Buffer.from(str)};
|
||||
BlobModel.create(bob, function(err, obj) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(obj.bin.toString(), str);
|
||||
BlobModel.findOne({where: {name: name}}, function(err, found) {
|
||||
assert.ok(!err);
|
||||
if (err) return done(err);
|
||||
assert.equal(found.bin.toString(), str);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
it('should create a model instance with geopoint type', function(done) {
|
||||
var city1 = {
|
||||
name: 'North York',
|
||||
loc: {
|
||||
lat: 43.761539,
|
||||
lng: -79.411079,
|
||||
},
|
||||
};
|
||||
var xcor, ycor;
|
||||
City.create(city1, function(err, res) {
|
||||
if (err) return done(err);
|
||||
res.loc.should.deepEqual(city1.loc);
|
||||
res.name.should.equal(city1.name);
|
||||
var sqlStmt = 'select ST_X(loc),ST_Y(loc) from City where id=1';
|
||||
db.connector.execute(sqlStmt, function(err, res) {
|
||||
if (err) return done(err);
|
||||
xcor = res[0]['ST_X(loc)'];
|
||||
ycor = res[0]['ST_Y(loc)'];
|
||||
City.find({where: {name: city1.name}}, function(err, found) {
|
||||
if (err) return done(err);
|
||||
found[0].name.should.equal(city1.name);
|
||||
found[0].loc.lng.should.equal(xcor);
|
||||
found[0].loc.lat.should.equal(ycor);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
it('should disconnect when done', function(done) {
|
||||
db.disconnect();
|
||||
done();
|
||||
|
@ -203,6 +232,11 @@ function setup(done) {
|
|||
bin: {type: Buffer, dataType: 'blob', null: false},
|
||||
name: {type: String},
|
||||
});
|
||||
|
||||
City = db.define('City', {
|
||||
name: {type: String},
|
||||
loc: {type: 'GeoPoint'},
|
||||
});
|
||||
query('SELECT VERSION()', function(err, res) {
|
||||
mysqlVersion = res && res[0] && res[0]['VERSION()'];
|
||||
blankDatabase(db, done);
|
||||
|
|
Loading…
Reference in New Issue