generateSelectRelationshipsSQL method
Implementation
FutureOr<SQL> generateSelectRelationshipsSQL(
Transaction transaction,
String entityName,
String table,
String field,
List<dynamic> ids,
String otherTableName,
) {
var retTableScheme = getTableScheme(table);
return retTableScheme.resolveMapped((tableScheme) {
if (tableScheme == null) {
var errorMsg = "Can't find `TableScheme` for table: $table";
_log.severe(errorMsg);
throw StateError(errorMsg);
}
var relationship = tableScheme.getTableRelationshipReference(
sourceTable: table,
sourceField: field,
targetTable: otherTableName,
);
if (relationship == null) {
throw StateError(
"Can't find TableRelationshipReference for tables: $table -> $otherTableName",
);
}
var q = dialect.elementQuote;
var conditionSQL = StringBuffer(
'$q${relationship.sourceRelationshipField}$q IN (',
);
var parameters = <String, dynamic>{};
for (var i = 0; i < ids.length; ++i) {
var p = 'p$i';
var id = ids[i];
parameters[p] = id;
if (i > 0) conditionSQL.write(', ');
conditionSQL.write('@$p');
}
conditionSQL.write(') ');
var conditionSQLStr = conditionSQL.toString();
var sql = StringBuffer();
sql.write('SELECT $q');
sql.write(relationship.sourceRelationshipField);
sql.write('$q as ${q}source_id$q , $q');
sql.write(relationship.targetRelationshipField);
sql.write('$q as ${q}target_id$q FROM $q');
sql.write(relationship.relationshipTable);
sql.write('$q WHERE ( ');
sql.write(conditionSQLStr);
sql.write(' )');
var condition = KeyConditionIN([
ConditionKeyField(relationship.sourceRelationshipField),
], ids);
return SQL(
sql.toString(),
ids,
{'ids': ids},
parameters,
condition: condition,
sqlCondition: conditionSQLStr,
returnColumnsAliases: {
relationship.sourceRelationshipField: 'source_id',
relationship.targetRelationshipField: 'target_id',
},
mainTable: relationship.relationshipTable,
relationship: relationship,
);
});
}