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