Support pointer in distinct query (#4471)

* Support pointer in distinct query

* extract transform pointer string
This commit is contained in:
Diamond Lewis
2017-12-29 21:32:40 -06:00
committed by GitHub
parent 7d773a5d8a
commit 6143988a82
4 changed files with 66 additions and 16 deletions

View File

@@ -6,6 +6,7 @@ import sql from './sql';
const PostgresRelationDoesNotExistError = '42P01';
const PostgresDuplicateRelationError = '42P07';
const PostgresDuplicateColumnError = '42701';
const PostgresMissingColumnError = '42703';
const PostgresDuplicateObjectError = '42710';
const PostgresUniqueIndexViolationError = '23505';
const PostgresTransactionAbortedError = '25P02';
@@ -1438,21 +1439,37 @@ export class PostgresStorageAdapter {
const isArrayField = schema.fields
&& schema.fields[fieldName]
&& schema.fields[fieldName].type === 'Array';
const isPointerField = schema.fields
&& schema.fields[fieldName]
&& schema.fields[fieldName].type === 'Pointer';
const values = [field, column, className];
const where = buildWhereClause({ schema, query, index: 4 });
values.push(...where.values);
const wherePattern = where.pattern.length > 0 ? `WHERE ${where.pattern}` : '';
let qs = `SELECT DISTINCT ON ($1:raw) $2:raw FROM $3:name ${wherePattern}`;
if (isArrayField) {
qs = `SELECT distinct jsonb_array_elements($1:raw) as $2:raw FROM $3:name ${wherePattern}`;
}
const transformer = isArrayField ? 'jsonb_array_elements' : 'ON';
const qs = `SELECT DISTINCT ${transformer}($1:raw) $2:raw FROM $3:name ${wherePattern}`;
debug(qs, values);
return this._client.any(qs, values)
.catch(() => [])
.catch((error) => {
if (error.code === PostgresMissingColumnError) {
return [];
}
throw error;
})
.then((results) => {
if (fieldName.indexOf('.') === -1) {
return results.map(object => object[field]);
results = results.filter((object) => object[field] !== null);
return results.map(object => {
if (!isPointerField) {
return object[field];
}
return {
__type: 'Pointer',
className: schema.fields[fieldName].targetClass,
objectId: object[field]
};
});
}
const child = fieldName.split('.')[1];
return results.map(object => object[column][child]);