Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement pointer types in postgres. #2086

Merged
merged 3 commits into from
Jun 17, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions spec/InstallationsRouter.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ describe('InstallationsRouter', () => {
});
});

it_exclude_dbs(['postgres'])('query installations with count = 1', (done) => {
it('query installations with count = 1', done => {
var androidDeviceRequest = {
'installationId': '12345678-abcd-abcd-abcd-123456789abc',
'deviceType': 'android'
Expand All @@ -130,10 +130,14 @@ describe('InstallationsRouter', () => {
expect(response.results.length).toEqual(2);
expect(response.count).toEqual(2);
done();
});
})
.catch(error => {
fail(JSON.stringify(error));
done();
})
});

it_exclude_dbs(['postgres'])('query installations with limit = 0 and count = 1', (done) => {
it('query installations with limit = 0 and count = 1', (done) => {
var androidDeviceRequest = {
'installationId': '12345678-abcd-abcd-abcd-123456789abc',
'deviceType': 'android'
Expand Down
4 changes: 2 additions & 2 deletions spec/ParseObject.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ describe('Parse.Object testing', () => {
});
});

it_exclude_dbs(['postgres'])("save cycle", function(done) {
it("save cycle", done => {
var a = new Parse.Object("TestObject");
var b = new Parse.Object("TestObject");
a.set("b", b);
Expand Down Expand Up @@ -1478,7 +1478,7 @@ describe('Parse.Object testing', () => {
expectError(Parse.Error.MISSING_OBJECT_ID, done));
});

it("fetchAll error on deleted object", function(done) {
it_exclude_dbs(['postgres'])("fetchAll error on deleted object", function(done) {
var numItems = 11;
var container = new Container();
var subContainer = new Container();
Expand Down
3 changes: 1 addition & 2 deletions spec/PurchaseValidation.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,7 @@ describe("test validate_receipt endpoint", () => {
});
});

it("should fail at appstore validation", (done) => {

it("should fail at appstore validation", done => {
request.post({
headers: {
'X-Parse-Application-Id': 'test',
Expand Down
2 changes: 1 addition & 1 deletion spec/helper.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use strict"
// Sets up a Parse API server for testing.

jasmine.DEFAULT_TIMEOUT_INTERVAL = process.env.PARSE_SERVER_TEST_TIMEOUT || 3000;
jasmine.DEFAULT_TIMEOUT_INTERVAL = process.env.PARSE_SERVER_TEST_TIMEOUT || 5000;

var cache = require('../src/cache').default;
var DatabaseAdapter = require('../src/DatabaseAdapter');
Expand Down
21 changes: 18 additions & 3 deletions src/Adapters/Storage/Postgres/PostgresStorageAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ export class PostgresStorageAdapter {
}
})
.then(() => this._client.query('INSERT INTO "_SCHEMA" ("className", "schema", "isParseClass") VALUES ($<className>, $<schema>, true)', { className, schema }))
.then(() => schema);
}

addFieldIfNotExists(className, fieldName, type) {
Expand Down Expand Up @@ -212,7 +213,7 @@ export class PostgresStorageAdapter {
// rejection reason are TBD.
getAllClasses() {
return this._ensureSchemaCollectionExists()
.then(() => this._client.map('SELECT * FROM "_SCHEMA"'), null, row => ({ className: row.className, ...row.schema }));
.then(() => this._client.map('SELECT * FROM "_SCHEMA"', null, row => ({ className: row.className, ...row.schema })));
}

// Return a promise for the schema with the given name, in Parse format. If
Expand Down Expand Up @@ -329,6 +330,10 @@ export class PostgresStorageAdapter {
updatePatterns.push(`$${index}:name = $${index + 1}`);
values.push(fieldName, fieldValue);
index += 2;
} else if (fieldValue.__type === 'Pointer') {
updatePatterns.push(`$${index}:name = $${index + 1}`);
values.push(fieldName, fieldValue.objectId);
index += 2;
} else {
return Promise.reject(new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, `Postgres doesn't support update ${JSON.stringify(fieldValue)} yet`));
}
Expand All @@ -352,7 +357,10 @@ export class PostgresStorageAdapter {
let where = buildWhereClause({ schema, query, index: 2 })
values.push(...where.values);

const qs = `SELECT * FROM $1:name WHERE ${where.pattern} ${limit !== undefined ? `LIMIT $${values.length + 1}` : ''}`;
const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
const limitPattern = limit !== undefined ? `LIMIT $${values.length + 1}` : '';

const qs = `SELECT * FROM $1:name ${wherePattern} ${limitPattern}`;
if (limit !== undefined) {
values.push(limit);
}
Expand Down Expand Up @@ -408,7 +416,14 @@ export class PostgresStorageAdapter {

// Executes a count.
count(className, schema, query) {
return Promise.reject('Not implemented yet.')
let values = [className];
let where = buildWhereClause({ schema, query, index: 2 });
values.push(...where.values);

const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
const qs = `SELECT COUNT(*) FROM $1:name ${wherePattern}`;
return this._client.query(qs, values)
.then(result => parseInt(result[0].count))
}
}

Expand Down
14 changes: 8 additions & 6 deletions src/Controllers/SchemaController.js
Original file line number Diff line number Diff line change
Expand Up @@ -408,23 +408,25 @@ class SchemaController {
return Promise.resolve(this);
}
// We don't have this class. Update the schema
return this.addClassIfNotExists(className).then(() => {
// The schema update succeeded. Reload the schema
return this.reloadData();
}, error => {
return this.addClassIfNotExists(className)
// The schema update succeeded. Reload the schema
.then(() => this.reloadData())
.catch(error => {
// The schema update failed. This can be okay - it might
// have failed because there's a race condition and a different
// client is making the exact same schema update that we want.
// So just reload the schema.
return this.reloadData();
}).then(() => {
})
.then(() => {
// Ensure that the schema now validates
if (this.data[className]) {
return this;
} else {
throw new Parse.Error(Parse.Error.INVALID_JSON, `Failed to add ${className}`);
}
}, error => {
})
.catch(error => {
// The schema still doesn't validate. Give up
throw new Parse.Error(Parse.Error.INVALID_JSON, 'schema class name does not revalidate');
});
Expand Down