Files
kami-parse-server/spec/InstallationsRouter.spec.js
CoderickLamar c7eb7daeae Fix for count being very slow on large Parse Classes' collections (Postgres) (#5330)
* Changed count to be approximate. Should help with postgres slowness

* refactored last commit to only fall back to estimate if no complex query

* handlign variables correctly

* Trying again because it was casting to lowercase table names which doesnt work for us/

* syntax error

* Adding quotations to pg query

* hopefully final pg fix

* Postgres will now use an approximate count unless there is a more complex query specified

* handling edge case

* Fix for count being very slow on large Parse Classes' collections in Postgres. Replicating fix for Mongo in issue 5264

* Fixed silly spelling error resulting from copying over notes

* Lint fixes

* limiting results to 1 on approximation

* suppress test that we can no longer run for postgres

* removed tests from Postgres that no longer apply

* made changes requested by dplewis

* fixed count errors

* updated package.json

* removed test exclude for pg

* removed object types from method

* test disabled for postgres

* returned type

* add estimate count test

* fix mongo test
2019-04-08 17:59:15 -05:00

314 lines
7.5 KiB
JavaScript

const auth = require('../lib/Auth');
const Config = require('../lib/Config');
const rest = require('../lib/rest');
const InstallationsRouter = require('../lib/Routers/InstallationsRouter')
.InstallationsRouter;
describe('InstallationsRouter', () => {
it('uses find condition from request.body', done => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {
where: {
deviceType: 'android',
},
},
query: {},
info: {},
};
const router = new InstallationsRouter();
rest
.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
)
.then(() => {
return rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
);
})
.then(() => {
return router.handleFind(request);
})
.then(res => {
const results = res.response.results;
expect(results.length).toEqual(1);
done();
})
.catch(err => {
fail(JSON.stringify(err));
done();
});
});
it('uses find condition from request.query', done => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {},
query: {
where: {
deviceType: 'android',
},
},
info: {},
};
const router = new InstallationsRouter();
rest
.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
)
.then(() => {
return rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
);
})
.then(() => {
return router.handleFind(request);
})
.then(res => {
const results = res.response.results;
expect(results.length).toEqual(1);
done();
})
.catch(err => {
jfail(err);
done();
});
});
it('query installations with limit = 0', done => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {},
query: {
limit: 0,
},
info: {},
};
Config.get('test');
const router = new InstallationsRouter();
rest
.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
)
.then(() => {
return rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
);
})
.then(() => {
return router.handleFind(request);
})
.then(res => {
const response = res.response;
expect(response.results.length).toEqual(0);
done();
})
.catch(err => {
fail(JSON.stringify(err));
done();
});
});
it_exclude_dbs(['postgres'])('query installations with count = 1', done => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {},
query: {
count: 1,
},
info: {},
};
const router = new InstallationsRouter();
rest
.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
)
.then(() =>
rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
)
)
.then(() => router.handleFind(request))
.then(res => {
const response = res.response;
expect(response.results.length).toEqual(2);
expect(response.count).toEqual(2);
done();
})
.catch(error => {
fail(JSON.stringify(error));
done();
});
});
it_only_db('postgres')('query installations with count = 1', async () => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {},
query: {
count: 1,
},
info: {},
};
const router = new InstallationsRouter();
await rest.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
);
await rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
);
let res = await router.handleFind(request);
let response = res.response;
expect(response.results.length).toEqual(2);
expect(response.count).toEqual(0); // estimate count is zero
const pgAdapter = config.database.adapter;
await pgAdapter.updateEstimatedCount('_Installation');
res = await router.handleFind(request);
response = res.response;
expect(response.results.length).toEqual(2);
expect(response.count).toEqual(2);
});
it_exclude_dbs(['postgres'])(
'query installations with limit = 0 and count = 1',
done => {
const config = Config.get('test');
const androidDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abc',
deviceType: 'android',
};
const iosDeviceRequest = {
installationId: '12345678-abcd-abcd-abcd-123456789abd',
deviceType: 'ios',
};
const request = {
config: config,
auth: auth.master(config),
body: {},
query: {
limit: 0,
count: 1,
},
info: {},
};
const router = new InstallationsRouter();
rest
.create(
config,
auth.nobody(config),
'_Installation',
androidDeviceRequest
)
.then(() => {
return rest.create(
config,
auth.nobody(config),
'_Installation',
iosDeviceRequest
);
})
.then(() => {
return router.handleFind(request);
})
.then(res => {
const response = res.response;
expect(response.results.length).toEqual(0);
expect(response.count).toEqual(2);
done();
})
.catch(err => {
fail(JSON.stringify(err));
done();
});
}
);
});