Support pointer in distinct query (#4471)
* Support pointer in distinct query * extract transform pointer string
This commit is contained in:
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user