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);
});
}