generateSelectRelationshipsSQL method

FutureOr<SQL> generateSelectRelationshipsSQL(
  1. Transaction transaction,
  2. String entityName,
  3. String table,
  4. String field,
  5. List ids,
  6. String otherTableName,
)

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